Java泛型扩展

Java泛型扩展,java,generics,Java,Generics,我在查看一个diff时看到了以下代码: public interface Vector<T extends Vector> public interface Vector<T extends Vector<T>> 公共接口向量 由以下代码替换: public interface Vector<T extends Vector> public interface Vector<T extends Vector<T>>

我在查看一个diff时看到了以下代码:

public interface Vector<T extends Vector>
public interface Vector<T extends Vector<T>>
公共接口向量
由以下代码替换:

public interface Vector<T extends Vector>
public interface Vector<T extends Vector<T>>
公共接口向量

我很难把我的头绕在它周围,有什么区别?它们的工作方式有什么不同?

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


此声明确保如果X实现向量,则它必须是X的向量:

class X implements Vector<X> {
...
类X实现了向量{ ... 任何其他操作都会产生编译器错误

实际上,JDK中使用了这样的构造:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
...
公共抽象类Enum实现了可比较的、可序列化的{
...

这意味着当我们声明enum X时(隐式地)extends
Enum

我认为这个页面应该回答您的所有问题:实际上它确实回答了我的问题,我有时在解析java泛型参数化语言时遇到困难。知道它是原始类型有助于我从ArrayList vs ArrayList等方面来考虑它。非常有趣的递归泛型。这是实际解释:这两种方法都没有多大意义,编写它的人也没有意识到,只需使用
公共接口向量
“此声明确保如果X实现向量,它必须是X的向量”不,它没有。现在我们可以使
类Y实现向量
类Y实现向量给出编译错误不,给定类
X
,正如您上面定义的那样。您尝试过吗?边界不匹配:类型X不是类型VectorC'mon的边界参数的有效替代品。我不知道您有什么问题有,但您做了一些错误的事情。这保证编译:接口向量{}类X实现向量{}类Y实现向量{}