我知道 Java 通常是不变的,因为它不想处理协变/逆变问题。
所以总的来说,
List<Parent> a = new ArrayList<Child>();
需要通过
(List)
进行类似类型擦除的转换才能工作。
但是,
List<Parent> p = Collections.singletonList(<Child>);
按原样工作,无需演员,尽管声称通过
文档返回
List<Child>
。
我做了一些实验,发现这是一般回报的属性,而不是特定于
Collections.singletonList
。
这里有几种可能性:
<Child>
参数是 (<Parent>) <Child>
,并进行隐式转换Vector<String> s = new Vector<>();
,在推理方面至少有点像这样List
,类型被删除,所以 List<T>
是一个用词不当
这里到底发生了什么,为什么在这种情况下,函数返回泛型时可以,但一般赋值时不行?
更进一步,Java 是如何实现和特殊情况的?
您误解了 javadoc。
singletonList
返回的名义类型:
List<Parent> p = Collections.singletonList(<Child>);
确实是
List<Parent>
。 javadoc 应该被理解为该方法的参数是 T
的实例或 T
的子类。 Child
是 Parent
的子类。
基本上,类型推断已经找出了
T
的类型,它满足上下文的所有类型约束......并使用了它。