Java实例可比较

时间:2016-06-28 10:16:24

标签: java generics

为什么创建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));
  }
}

2 个答案:

答案 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参数是无界的,所以它将接受任何类型。因此,您可以使用IntegerString

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具有可比性吗?

不,这是因为Integernew Box(); 中的原始类型具有可比性