由于仿制药是不变的。以下代码生成编译时错误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];
答案 0 :(得分:3)
第一个问题:解决这个问题你可以使用
Stack<? extends Object> stackOfObjects = stackOfStrings;
。你必须告诉编译器子类型在泛型类中也是允许的。
第二:我的编译器不允许它。
答案 1 :(得分:1)
目前还不清楚你在问什么。你说第一件事不起作用而第二件事不行,但两者之间并没有明显的联系。
泛型是不变的,这意味着Foo<A>
和Foo<B>
不是彼此的子类型,如果A
和B
是不同的具体类型,即使有子在A
和B
之间输入关系。
我没有看到第二个例子中发生的情况。可以在原始类型Foo
和Foo<A>
之间进行转换。这并没有像第一个例子那样从一个参数转换到另一个参数。