我以为我理解这一点但显然不是......
我有一个像这样的方法签名:
void doSomething(List<TypeA> typeAs){...}
List<TypeA<TypeB>> getTypeBTypeAs(){...}
但如果我试着打电话
doSomething(getTypeBTypeAs());
我收到编译错误:“类型中的方法doSomething(List)不适用于参数(List&gt;)”
但是,如果我将doSomething
的签名更改为
void doSomething(List<TypeA<?>> typeAs){...}
它仍然不起作用,但
void doSomething(List typeAs){...}
显然它可以绕过泛型。
这似乎很奇怪。
有人能填补我吗?
此外,在这种情况下,我希望doSomething
使用任何包含任何泛型类型的TypeAs的List; undefined,TypeB,TypeC等。
感谢。
答案 0 :(得分:4)
通用类TypeA<TypeB>
与TypeA
的类型不同。您无法传入方法需要TypeA<TypeB>
的{{1}}类型的参数。此外,TypeA
与TypeA<TypeB>
的类型不同,因此适用相同的约束。
经典示例(来自Effective Java, 2nd Ed. AFAIR)是:我们有动物容器(TypeA<TypeC>
)和Container<Animal>
的子类,我们有Animal
和{{1} }。现在,如果你有一个方法
Lion
它会接受狮子和蝴蝶。但是,这个功能
Butterfly
不接受void func(Animal animal);
,也不接受void func(Container<Animal> animalContainer);
。要意识到一个有助于保持狮子安全的强大笼子不会阻止蝴蝶飞走,反之亦然,一个厚而轻的网可以抓住蝴蝶,不会有机会对付狮子。
如果您确定任何类型的动物容器都适合您,请声明您的功能:
Container<Lion>
回到你的情况,我想接受Container<Butterfly>
和void func(Container<? extends Animal> animalContainer);
的唯一方法是这样的:
List<TypeA>
答案 1 :(得分:0)
试试这个:
<T> void doSomething(List<TypeA<T>> typeAs) { ... }
请注意该行开头的<T>
。这样doSomething接受包含任何TypeAs的每个List。