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