所以我想说我要绘制List<?>
的类层次结构。 List<Object>
是List<?>
那么List<Integer>
是List<Object>
的子类型还是List<?>
的子类型?
由于
答案 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);