不明白<T>和<?>的内容

lap*_*ots 2 java generics

例如,我有一堂课

class Element {}
Run Code Online (Sandbox Code Playgroud)

我有一些课程正在扩展这门课程

class ExtraElement extends Element {}
Run Code Online (Sandbox Code Playgroud)

那么这个陈述是一样的吗?

List<Element> list & List<? extends Element>
Run Code Online (Sandbox Code Playgroud)

因为据我所知wildcards定义了一类的类.在这两个语句中,我可以传递任何扩展类的元素,Element所以基本上是Element类的一部分.

Thi*_*ilo 5

不,他们不一样.

List<? extends Element>可能是a List<ExtraElement>或者它可能是a List<Element>,但编译器无法知道它是哪一个.

如果是List<ExtraElement>,你不能添加SomeNonExtraElement到列表中,例如(但你可以添加SomeNonExtraElementList<Element>).

要强制执行此操作,编译器将不允许您向a 添加任何内容List<? extends Something>.