为什么创建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));
  }
}发布于 2016-06-28 10:20:12
您已经用泛型类型参数声明了该类。这与实现可比较的接口不同:
public class Box<Comparable> {
}与以下相同:
public class Box<T> {
}这与以下情况不同:
public class Box<T> implements Comparable<T> {
    @Override
    public int compareTo(final T o) {
        return 0;
    }
}因为类型参数是无界的,所以它将接受任何类型。所以您可以使用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>。这是不好的做法,应该避免。
您可以阅读更多关于原始类型这里的信息。
如果要强制执行类型参数实现可比较,则可以:
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>(); 
    }
}https://stackoverflow.com/questions/38073420
复制相似问题