我以为我明白了这一点,但显然不是……
我有这样的方法签名: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
的子类,我们具有Lion
和Butterfly
。现在,如果您有方法
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/