当前位置: 首页 > 面试题库 >

泛型,方法签名,赋值

卓云
2023-03-14
问题内容

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

我有这样的方法签名:

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中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符