我以为我明白了这一点,但显然不是……

我有这样的方法签名:

void doSomething(List<TypeA> typeAs){...}

List<TypeA<TypeB>> getTypeBTypeAs(){...}

但是如果我尝试打电话

doSomething(getTypeBTypeAs());

我收到一个编译错误:“类型中的方法doSomething(List)...不适用于参数(List>)”

但是,如果我将doSomething的信号更改为

void doSomething(List<TypeA<?>> typeAs){...}

它仍然不起作用,但是

void doSomething(List typeAs){...}

显然,它可以绕开泛型使用。

这似乎很奇怪。

有人可以填写我吗?

另外,在这种情况下,我希望doSomething与包含任何通用类型的TypeAs的任何List一起使用;未定义,TypeB,TypeC等

谢谢。

最佳答案

通用类TypeA<TypeB>是与TypeA不同的类型。您不能传入类型为TypeA<TypeB>的参数,而该方法需要一个TypeA。此外,TypeA<TypeB>是与TypeA<TypeC>不同的类型,因此适用相同的约束。

经典示例(来自Effective Java, 2nd Ed. AFAIR)是:我们具有用于动物(Container<Animal>)的容器,作为Animal的子类,我们具有LionButterfly。现在,如果您有方法

void func(Animal animal);


它会接受狮子和蝴蝶。但是,此功能

void func(Container<Animal> animalContainer);


将不接受Container<Lion>,也不接受Container<Butterfly>。一定要意识到,一个坚固的笼子可用于安全地保护狮子,但不会阻止蝴蝶飞走,反之亦然,一个厚而轻的网罩可以阻止蝴蝶对付狮子。

如果您真的确定任何一种动物容器都适合您,请声明您的函数,如下所示:

void func(Container<? extends Animal> animalContainer);


回到您的情况,我想接受List<TypeA>List<TypeA<TypeB>>的唯一方法是这样的:

void doSomething(List<?> list);

关于java - 泛型,方法签名,赋值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2292308/

10-09 01:44