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类型的参数,其中方法需要TypeATypeATypeA类型不同,因此适用相同的约束。

经典的例子(来自Effective Java,2nd Ed.AFAIR)是:我们有动物ContainerContainer ), Animal子类我们有LionButterfly 。 现在,如果你有一个方法

 void func(Animal animal); 

它会接受狮子和蝴蝶。 但是,这个function

 void func(Container animalContainer); 

不接受Container ,也不接受Container 。 要意识到一个强大的笼子可以安全地保持狮子不会阻止蝴蝶飞走,反之亦然,一个厚而轻的网可以抓住蝴蝶,不会对抗狮子。

如果您确定任何类型的动物容器都适合您,请声明您的function如下:

 void func(Container animalContainer); 

回到你的情况,我想接受ListList>的唯一方法是这样的:

 void doSomething(List list); 

尝试这个:

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

注意行开头的 。 这样doSomething接受包含任何TypeAs的每个List。