子类型层次结构

时间:2010-11-24 08:55:11

标签: java

所以我想说我要绘制List<?>的类层次结构。 List<Object>List<?>

的子类型

那么List<Integer>List<Object>的子类型还是List<?>的子类型?

由于

2 个答案:

答案 0 :(得分:2)

  

那么List<Integer>List<Object>的子类型吗?

不,Java中的泛型类是not covariant

从以上链接:

  

事实证明它有一个很好的理由它不会那样工作:它会破坏应该提供的类型安全通用。想象一下,您可以将List<Integer>分配给List<Number>。然后,以下代码允许您将不是Integer的内容放入List<Integer>

List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));

List<?>略有不同,如果我理解正确的话,它类似于原始类型,因为这里的类型参数是 unknown 。例如,第二行编译正常,但现在第三行是非法的,因为编译器可以确定它是合法的add操作:

List<Integer> li = new ArrayList<Integer>();
List<?> ln = li;
ln.add(new Float(3.1415)); // illegal

因此,假设“可分配给”子类型的定义,我认为List<Object>List<?>的子类型。

答案 1 :(得分:0)

类或接口是自己孩子的唯一地方是评估通用边界。

一些示例方法签名:

public <E extends<Enum<E>> void doSomeThingWithAnEnum(E item);

public <S extends Comparable<? super S>> void sort(S[] items);

但这不是真正的类型层次结构,编译器会删除所有这些信息。结果字节代码大致相当于:

public void doSomeThingWithAnEnum(Enum item);

public void sort(Comparable[] items);