在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)
那么为什么泛型被认为是不变的呢?
List<? extends Exception> k = new ArrayList<NumberFormatException>();这意味着列表可以采用Exception的子类型
不完全的.您可以分配到k一个List-或任何其子类型的,因为你ArrayList-在这种情况下,任何亚型Exception.
但是你不能添加到k任何亚型Exception,或任何与此有关,因为k是List的一些未知的亚型的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)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |