为什么当"?延伸Klass"被允许时,泛型被认为是不变的?

bat*_*man 4 java generics

在Java中,它说:

String[] is subtype of Object[]
Run Code Online (Sandbox Code Playgroud)

所以阵列据说是协变的.但对于仿制药他们说:

List<X> will not be subType of List<Y>.
Run Code Online (Sandbox Code Playgroud)

因此它不变.但问题是," 仿制药是否真的不变 "?

例如,如果我给:

List<? extends Exception>
Run Code Online (Sandbox Code Playgroud)

这意味着列表可以采取亚型Exception,比方说,这是有效的:

List<? extends Exception> k = new ArrayList<NumberFormatException>();
Run Code Online (Sandbox Code Playgroud)

那么为什么泛型被认为是不变的呢?

Mis*_*ble 7

List<? extends Exception> k = new ArrayList<NumberFormatException>();

这意味着列表可以采用Exception的子类型

不完全的.您可以分配k一个List-或任何其子类型的,因为你ArrayList-在这种情况下,任何亚型Exception.

但是你不能添加k任何亚型Exception,或任何与此有关,因为kList一些未知的亚型Exception.例如,

k.add(new NumberFormatException());
Run Code Online (Sandbox Code Playgroud)

会给出错误.

检索也仅限于已知类型:

NumberFormatException e1 = k.get(0); // error
Exception e2 = k.get(0); // ok, anything in k must be an Exception
NumberFormatException e3 = (NumberFormatException) k.get(0); // ok, but the usual downcast issues exist
Run Code Online (Sandbox Code Playgroud)