[英]Initialise Java List in Scala with Java ArrayList
当在斯卡拉,我写
val data: java.util.List[java.util.List[Double]] = new java.util.ArrayList[java.util.ArrayList[Double]]()
我得到错误
util.ArrayList [util.ArrayList [Double]]类型的表达式与预期的util.List [util.List [Double]]类型不符
我究竟做错了什么?
我的答案适用于Java,但我想原因是相同的。
您正在将子类型的多态与泛型混合。 确实可以将ArrayList<T>
分配给List<T>
变量,但是这里有一个List<List<T>>
并且您正在尝试分配类型为ArrayList<ArrayList<T>>
。
但是,即使F是E的子类型, List<E>
也不是List<F>
的子类型,因此不允许直接这样做(不变性),但是Scala具有管理此问题的工具 (因为Java具有边界和通配符)。
您应该使用val data: java.util.List[java.util.List[Double]] = new java.util.ArrayList[java.util.List[Double]]()
因为泛型类型在Java中不是多态的。 看到这个
您也可以编写以下内容以显式类型:
val data: java.util.List[? extends java.util.List[Double]] = new java.util.ArrayList[java.util.ArrayList[Double]]()
易于理解,即使B extends A
List<A>
也不是List<B>
的super
B extends A
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.