Java 错误论点:为什么是列表<;列表<&燃气轮机&燃气轮机;不等同于列表<;对象>;?
以下代码给出了一个编译错误:Java 错误论点:为什么是列表<;列表<&燃气轮机&燃气轮机;不等同于列表<;对象>;?,java,Java,以下代码给出了一个编译错误: publicstaticfunctionacquisitioncolors=(col)->Seq.of( Tuple.Tuple(Formatter.COLOR, 序号( 序号of(col.toList(), 序号( 序列号(“停止”、“停止”,空,“红色”).toList(), “学习”、“学习”的顺序,空,“灰色”).toList(), 序列号(“停止”、“停止”,空,“红色”).toList(), “Reduce”、“reducef”、null、“orange
publicstaticfunctionacquisitioncolors=(col)->Seq.of(
Tuple.Tuple(Formatter.COLOR,
序号(
序号of(col.toList(),
序号(
序列号(“停止”、“停止”,空,“红色”).toList(),
“学习”、“学习”的顺序,空,“灰色”).toList(),
序列号(“停止”、“停止”,空,“红色”).toList(),
“Reduce”、“reducef”、null、“orange”的顺序。toList(),
“保留”、“保留”,空,“绿色”)的顺序。toList(),
序列号(“增加”、“增加”,空,“蓝色”)。toList()
)托利斯先生()
)托利斯先生()
)
);
为什么会发生这种情况?您应该看看Java中的类型擦除和原始类型 列表使用泛型,因此当您尝试创建具有定义原始类型的列表时,它将使用
对象
List list;
// means that list holds Objects
List<String> listOfStrings;
// means that list holds Strings
为什么我不能将列表
转换为列表
?List
不也是对象吗
因为<代码>列表
意味着它可以在给定的列表中包含任何对象
,甚至是一个映射
,但是当您将其转换为列表
时,包含任何对象
就不再有意义,并且仅限于列表
使用
Collections.singletonList()
时它是如何工作的
这仅仅是因为
Collections.singletonList()
正在返回一个List
,所以编译器在运行时不会对此抱怨。请参阅Lesiak关于编译时类型参数推断的回答。答案的两部分:
List
是不变的,因此类型为ListCollections的表达式。singletonList()实际上是根据文档返回一个列表。
我相信您误解了文档。这是完全错误的。列表
的每个实现都是对象
的子类型。
public static Function<int[], Stream<Tuple2<Formatter, List<Object>>>> acquisitionColors = (col) -> Seq.of(
Tuple.tuple(Formatter.COLOR,
Collections.singletonList(
...
).toList())
)
);
List list;
// means that list holds Objects
List<String> listOfStrings;
// means that list holds Strings
List<List<? extends java.lanq.Object>> // (Object or children of it)