2013-12-23 165 views
4

我一直在寻找一个差异,看到这样的代码:Java泛型扩展

public interface Vector<T extends Vector> 

这是由以下代码取代:

public interface Vector<T extends Vector<T>> 

我有麻烦缠绕我的周围的头,什么是区别?他们如何工作不同?

+2

我觉得这个页面应该回答您的所有问题:HTTP:/ /stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it – robbmj

+1

其实它回答我的问题,我有时有麻烦解析Java泛型参数化的语言在狂野。知道这是一个原始类型帮助我从ArrayList vs ArrayList 等角度考虑它。 – talloaktrees

+0

非常有趣的递归泛型。 –

回答

-1

这两个声明之间的区别在于第一个声明会产生编译器警告,第二个声明不会。这是因为泛型类型应该总是和参数一起使用。

该声明确保如果X实现矢量它必须是X的向量:

class X implements Vector<X> { 
... 

任何东西都不会产生一个编译错误。

其实这种结构用于在JDK:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { 
... 

这意味着,当我们声明枚举X它(隐含的)延伸Enum<X>

+0

“这个声明确保了如果X实现了Vector,它必须是X的Vector”否,它不会。现在我们可以使'Y类实现矢量' – newacct

+0

'Y类实现向量给出编译错误 –

+0

不,它不,如上面定义的类'X'。你甚至尝试过吗? – newacct