java泛型的差异

Exo*_*mus 7 java generics

拜托,我想知道写作之间的区别

public class Something<T extends Comparable<T>> {// }
Run Code Online (Sandbox Code Playgroud)

public class Something<T extends Comparable> {// }
Run Code Online (Sandbox Code Playgroud)

以及它将如何影响代码

ars*_*jii 4

区别在于,在第一种情况下,类型参数T必须与其自身进行比较,而在第二种情况下,类型参数T可以与任何内容进行比较。一般来说,当一个类C具有可比性时,Comparable<C>无论如何都会声明它要实现。尽管如此,这里有一个例子,说明第一个不起作用但第二个可以:

class C1<T extends Comparable<T>> {  // first case
}

class C2<T extends Comparable> {  // second case
}

class A {  // some super class
}

class B extends A implements Comparable<A> {  // comparable to super class
    @Override
    public int compareTo(A o) {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在:

new C1<B>();  // error
new C2<B>();  // works
Run Code Online (Sandbox Code Playgroud)

一般来说,您不应该使用第二种方法;尽可能远离原始类型。另请注意,第二种方法的更好选择是

public class Something<T extends Comparable<? super T>> { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

使用它也C1将允许new C1<B>()上面的行编译。