Java - 接口扩展自身

10

我现在已经使用这个网站大约6个月了,现在是时候问我的第一个问题了,因为我找不到答案,至少没有我能理解的答案!

在这段代码中,为什么这个接口要继承自身?

public interface PositionedVertex<V extends PositionedVertex<V>> {

/**
 * @return Position for node data.
 */
public Point getPosition();
}

这段代码不也会实现同样的功能吗?

public interface PositionedVertex<V> {

/**
 * @return Position for node data.
 */
public Point getPosition();
}

提前致谢!


1
你应该真正接受其中一个优秀的答案。 - Patrick M
这篇文章非常好地解释了它:http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ106 - Mr Matrix
5个回答

13

接口没有扩展自己。 <V extends PositionedVertex<V>> 是与您的接口关联的通用类型的绑定。 它只是意味着实现此接口的任何类的通用类型参数本身必须是 PositionedVertex


这让我感到困惑,为什么在这种情况下我们需要泛型呢?难道在这个例子中完全不使用泛型就无法实现吗? - Mr Matrix
@MrMatrix 在问题的显式代码中,没有特定目的。假设类中的其他代码需要根据奇异递归模板模式引用其自身特定类型而不是超类/接口。对于需要返回this的方法的对象,例如Build Pattern、流畅编程和多态链接,这是一个非常有用的自我引用。 - rgettman
谢谢你的解释,我学到了新东西。你能解释一下这与父类(超类/接口)-子类关系有什么不同吗?我无法理解这个微妙之处。 - Mr Matrix
@Mts 关闭。我的意思是类型参数必须是 PositionedVertex<V> 的子类型。 - rgettman
1
@Mts 并且使用符合约束的类型参数。它可以是接口本身或扩展接口。子类型示例 - rgettman
显示剩余2条评论

4
在第一个例子中,你将泛型类型参数限定为该接口的子类型,而在第二个例子中,你可以有任何类型作为泛型类型参数。因此,它们可能是不同的声明。
例如,你可以定义一个引用如下:
PositionedVertex<String>

适用于第二种接口类型,但不适用于第一种接口。


谢谢!回答超级快! - user2069658

1

它不是在扩展自身,而是指定其泛型参数 V 必须表示一种扩展或实现自身的类型。


0

没有展示更多的代码,我们无法确定原因。或者这就是全部?实际上它告诉你的是,在此接口中(作为函数参数或返回类型),有某种类型 V 被使用,它与接口本身相同。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接