当泛型不协变时,为什么可以显式地转换泛型类型数组?

时间:2015-03-23 13:09:11

标签: java arrays generics covariance

由于仿制药是不变的。以下代码生成编译时错误incompatible types

Stack<String> stackOfStrings = new Stack<String>();
Stack<Object> stackOfObjects = stackOfStrings;

为什么接下来的代码会生成编译器可接受的字符串堆栈数组,并在教科书中讲授,例如Robert Sedgwick和Kevin Wayne撰写的 Algorithms,4th Edition 。 158:

Stack<String>[] a = (Stack<String>) Stack[];

编辑:直接从教科书中获取的上述片段实际上是(对不起错误):

Stack<String>[] a = (Stack<String>[]) new Stack[N];

2 个答案:

答案 0 :(得分:3)

第一个问题:解决这个问题你可以使用 Stack<? extends Object> stackOfObjects = stackOfStrings;。你必须告诉编译器子类型在泛型类中也是允许的。

第二:我的编译器不允许它。

答案 1 :(得分:1)

目前还不清楚你在问什么。你说第一件事不起作用而第二件事不行,但两者之间并没有明显的联系。

泛型是不变的,这意味着Foo<A>Foo<B>不是彼此的子类型,如果AB是不同的具体类型,即使有子在AB之间输入关系。

我没有看到第二个例子中发生的情况。可以在原始类型FooFoo<A>之间进行转换。这并没有像第一个例子那样从一个参数转换到另一个参数。