我以为我明白了这一点,但显然不是……
我有这样的方法签名:
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;undefined,TypeB,TypeC等
谢谢。
泛型类TypeA<TypeB>
与的类型不同TypeA
。您不能在TypeA<TypeB>
方法需要使用的地方传递类型的参数TypeA
。也是TypeA<TypeB>
不同于的类型TypeA<TypeC>
,因此适用相同的约束。
经典示例(来自有效Java,第二版
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);
我有一个方法,我想在其中接受必须扩展抽象类的类类型。之间的区别是什么 ? 在第二种情况下,我不能直接引用方法内部的类型。哪些类类型可以传递给这两个方法有什么不同吗?
问题内容: 我了解集合的获取和放置原理:如果某个方法接受一个集合,它将向其中写入类型T,则参数必须为;而如果它将从中读取类型T,则参数必须为。 但是有人可以解释一下签名: 特别是为什么而不是? 问题答案: Josh Bloch的助记符 PECS 在这里很有用。它代表: 生产者,消费者 这意味着,当一个参数化的类型被传递给的方法将 产生 的实例(它们将从它以某种方式被检索),应该被使用,因为子类的任
我正在尝试制作一些适用于数字的通用函数,但我正在努力处理函数签名。 也许我是从错误的角度来讨论这个问题,但到目前为止,我是在这里独立完成的。我并不是一心要这样做;因此,如果我从错误的角度来解决这个问题(创建一个通常有用的数学函数库),那么一定要教育我。 假设我想要一个函数,将两个数字相加: 这不会编译。这里是一个游乐场:https://play.integer32.com/?version=sta
我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8
问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符