您将参数化类型与具体类型混淆了。
给定List<T>,T 是参数化类型。
List<String> 与 List<Object> 没有任何类型关联,就像 List<String> 与 List<Number> 关联一样。 type 是 List<String>,整个 签名是 type。但就像所有事情一样,也有例外。这些被称为Wildcard Parameterized Types。
List<?> 就是所谓的Unbounded Wildcard Parameterized Type,它的工作方式与原始类型非常相似,它们在语义上是相同的,但会导致更多关于不安全转换的编译器警告。
List<? extends Object> 是一个有界通配符参数化类型,并且是一种允许您放置任何 extends Object 的类型,但由于 Java 中的每个类 extends Object 它在语义上与前两个选项没有任何不同.
现在它们的功能都相同,但它们会通过instanceof 测试,它们是不相同的类型。
换句话说:
public void myfunction(final List<Object> list) {}
只接受List<Object> 的type,List 与type 与List<Object> 或List<?> 无关,即使它们在语义上都具有相同的功能。
type 是List 或List<Object> 或List<String>,<> 中的继承链在涉及List<T> 的类型时不考虑,直到你进入Wild Card Parameterized Types
以下是示例:
Collection<?> coll = new ArrayList<String>();
List<? extends Number> list = new ArrayList<Long>();
你不能实例化一个 new Collection<?> 只分配一个具体的实现给它。
List<Object> 是整个类型。
Java 中的泛型与 C++ 中的实现完全不同,只是名称令人困惑。