为什么创建new Box();
和new Box<Integer>();
是合法的?是因为Box
具有可比性吗?
public class Box<Comparable> {
private boolean compareTo(Box b) {
return (this.y > b.y);
}
double x=0;
double y=0;
public static void main (String[] args) {
Box a = new Box();
Box b = new Box<Integer>();
System.out.println(a.compareTo(b));
}
}
答案 0 :(得分:5)
您已使用泛型类型参数声明了该类。这与实现Comparable接口不同:
public class Box<Comparable> {
}
与:
相同public class Box<T> {
}
与...不同:
public class Box<T> implements Comparable<T> {
@Override
public int compareTo(final T o) {
return 0;
}
}
因为type参数是无界的,所以它将接受任何类型。因此,您可以使用Integer
或String
:
public class Box<T> {
public static void main(String[] args) {
Box a = new Box();
Box b = new Box<>();
Box c = new Box<Integer>();
Box d = new Box<String>();
}
}
您可以在不指定类型的情况下创建新Box
的原因是向后兼容性。新的Box
将具有原始类型Box<T>
。这是不良做法,应该避免。
您可以阅读有关原始类型here
的更多信息如果你想强制type参数实现Comparable,那么你可以这样做:
import java.awt.*;
public class Box<T extends Comparable<T>> {
public static void main(String[] args) {
Box a = new Box();
Box b = new Box<>();
Box c = new Box<Integer>();
Box d = new Box<String>();
// This one will not work as Rectangle does not implement Comparable!
Box e = new Box<Rectangle>();
}
}
答案 1 :(得分:1)
简答:
为什么创建
new Box();
和new Box<Integer>();
是合法的?是因为Box
具有可比性吗?
不,这是因为Integer
或new Box();
中的原始类型具有可比性。