泛型,方法签名,作业

时间:2010-02-18 21:24:47

标签: java generics

我以为我理解这一点但显然不是......

我有一个像这样的方法签名:

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等。

感谢。

2 个答案:

答案 0 :(得分:4)

通用类TypeA<TypeB>TypeA的类型不同。您无法传入方法需要TypeA<TypeB>的{​​{1}}类型的参数。此外,TypeATypeA<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。