泛型通配符混乱

时间:2014-03-26 12:18:33

标签: java generics

之间的功能区别是什么
Container<Class>

Container<? extends Class>

继承自Class的任何内容都是Class,所以我不明白为什么要打扰?

1 个答案:

答案 0 :(得分:3)

由于Class课程为final<? extends Class>仅适用于Class类型。

因此,Container<Class>Container<? extends Class>之间没有功能差异。

更新:如果您的问题涉及什么是通配符?,如果我们假设我们不是在谈论Class,而是在谈论其他一些问题(可扩展) )类型,这是区别:

假设我们有两个类:

  • class Shape
  • class Rectangle extends Shape

考虑以下方法签名:

public void addRectangle(List<? extends Shape> shapes)

这是有界通配符的示例,其中Shape部分称为upper bound

public void addRectangle(List<? extends Shape> shapes) {
    // Compile-time error!
    shapes.add(0, new Rectangle());
}

编译时错误的原因是shapes.add()的第二个参数的类型是? extends Shape,在人类语言中意味着 一个未知的Shape子类型 即可。由于我们不知道它是什么类型,我们不知道它是否是Rectangle的超类型。它可能是也可能不是超类型,因此传递Rectangle是不安全的。

该例子取自: