拜托,我想知道写作和写作的区别
public class Something<T extends Comparable<T>> {// }
和
public class Something<T extends Comparable> {// }
以及这将如何影响代码
不同之处在于,在第一种情况下,类型参数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;
}
}
现在:
new C1<B>(); // error
new C2<B>(); // works
一般来说,你不应该使用第二种方法。尽可能远离原始类型。另请注意,第二种方法的更好选择是
public class Something<T extends Comparable<? super T>> { /*...*/ }
使用它C1
也可以new C1<B>()
编译上面的行。
这就是区别所在。
如果您不在接口中使用泛型,则必须强制转换。签名包括Object
:
package generics;
/**
* NonGenericComparable description here
* @author Michael
* @link http://stackoverflow.com/questions/18944582/difference-in-java-generics?noredirect=1#comment27975341_18944582
* @since 9/22/13 10:55 AM
*/
public class NonGenericComparable implements Comparable {
private final int x;
public NonGenericComparable(int x) {
this.x = x;
}
public int getX() {
return x;
}
@Override
public int compareTo(Object o) {
NonGenericComparable other = (NonGenericComparable) o;
if (this.x < other.x) return -1;
else if (this.x > other.x) return +1;
else return 0;
}
}
如果您使用泛型,您将获得更高的类型安全性。不需要铸造。
package generics;
/**
* GenericComparable uses generics for Comparable
* @author Michael
* @link http://stackoverflow.com/questions/18944582/difference-in-java-generics?noredirect=1#comment27975341_18944582
* @since 9/22/13 10:53 AM
*/
public class GenericComparable implements Comparable<GenericComparable> {
private final int x;
public GenericComparable(int x) {
this.x = x;
}
public int getX() {
return x;
}
@Override
public int compareTo(GenericComparable other) {
if (this.x < other.x) return -1;
else if (this.x > other.x) return +1;
else return 0;
}
}