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

Java泛型:列表> =新的LinkedList>()被禁止吗?

督冠玉
2023-03-14
问题内容

怎么会用Java写

List<?> list = new LinkedList<Double>();

但不是

List<Container<?>> list = new LinkedList<Container<Double>>();

容器就像

public class Container<T> { ... }

这是因为我有一个接受一个的方法List<Container<?>>,并且我想使用Arrays.asList将参数传递给它:

process(Arrays.asList(new Container<Double>(), new Container<Double>()));

但是该语言不允许这样做,因为它会推断Arrays.asListbe
的类型List<Container<Double>>,并且该类型不可分配给List<Container<?>>

如果我将字符串参数化的容器添加到调用中,

process(Arrays.asList(new Container<Double>(), new Container<String>()));

它仍然无法正常工作,因为它会推断List<Container<? extends Serializable & Comparable<?>>>Arrays.asList 的类型。仅当我传递了既不可比较也不可序列化的内容时,它才能正常工作。

当然,我可以进行强制转换并关闭编译器,但我想知道我在这里是否做错了什么。


问题答案:

每个参数化必须通配:

List<? extends Container<?>> list = new LinkedList<Container<Double>>();

编辑:我正在搜索Angelika
Langer的FAQ
中的一种解释,但没有找到一种解释(可能在那儿,但隐藏在500页中的某处)。

考虑这一点的方法是每个参数化都是独立的,除非您明确表示这样做,否则编译器不会推断有关参数化的信息。



 类似资料:
  • 问题内容: 我为缓存编写了一个函数来检索特定对象。这样我就不需要投了。 我正在这样使用 但是现在我的缓存中有一个字符串列表,我不能这样使用 问题是。我对Java非常陌生,我该怎么写? 问题答案: 您无法获得的类,在您的情况下,唯一的方法是:

  • 问题内容: 我查看了Java Generics文档 ,发现了这段代码, 我可以理解,我们正在从中获取一个元素并将其设置为另一个。因此,编译器给出了一个错误。我的问题是,它是有道理的,当2列出了不同即这里列出了和是不同的。但是在上面的示例中,和是相同的列表。为什么编译器不够聪明才能看到呢?实施起来难吗? 编辑 :我知道我可以通过辅助方法或使用代替来修复它。只是想知道为什么编译器不为我做。 问题答案:

  • 问题内容: 另一个示例非常复杂,我一点也不了解,我的问题在某种程度上是相似的,但是正如我所说的那样,它更简单并且可能会给出更简单的答案 问题答案: 我相信您正在寻找一种采用列表的方法,向其中添加一些内容,然后返回列表。该列表是通用的,您希望返回类型与参数的类型匹配。 通常情况下,这是您的操作方法: 具体来说,您尝试添加到中。这行不通。可以使用多种列表来调用,而添加只能在列表为a 或a时起作用。这是

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 我学完了泛型,发现并不容易。不过,我确实理解了。这是我理解的。我要你纠正我错的地方,并回答几个问题:)。 null null null null null null null null 内部类也必须实现Serializable吗?

  • 如何在Java中正确建模包含泛型类型的多个实例的列表,每个实例不一定具有完全相同的具体类型参数(而是共享的公共根类型)。