【问题标题】:Initialise Java List in Scala with Java ArrayList使用 Java ArrayList 在 Scala 中初始化 Java 列表
【发布时间】:2018-04-28 21:01:39
【问题描述】:

当我在 scala 中时,我会写

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]] 类型

我做错了什么?

【问题讨论】:

  • 我猜是这样的val data: java.util.List[java.util.List[Double]] = new java.util.ArrayList[java.util.List[Double]]()
  • @JoachimHuet:谢谢!那行得通。如果你喜欢,你可以把它变成一个答案——也许提供一个解释(否则人们会评论,它的内容太少了)。到时候我会除掉它。

标签: java scala type-conversion


【解决方案1】:

你应该使用val data: java.util.List[java.util.List[Double]] = new java.util.ArrayList[java.util.List[Double]]()

因为泛型类型在 Java 中不是多态的。见this

您还可以编写以下内容以明确类型:

val data: java.util.List[? extends java.util.List[Double]] = new java.util.ArrayList[java.util.ArrayList[Double]]()

为了容易理解,List<A> 不是List<B>super,即使B extends A

【讨论】:

  • 1. Java 泛型类型不是多态的,Scala 类型可以。 2. 最后一种类型的Scala语法是java.util.List[_ <: java.util.List[Double]]
  • @AlexeyRomanov:使用 2。我稍后在将 data 传递给除 java.util.List[java.util.List[Double]] 之外的方法时遇到错误:方法签名不存在。
  • @Make42 要使用这些方法,您需要第一个解决方案,它们并不等效。 java.util.List[_ <: java.util.List[Double]]java.util.List[java.util.List[Double]] 的超类型,所以这就像将 Object 传递给期望 String 的方法:你想得到错误!
  • @AlexeyRomanov:对不起,我的理解很慢:“第一个解决方案”是什么意思?也许您可以写一个答案并以较小的步骤进行解释?我认为这对将来的读者也有帮助:-)。
  • @Make42 第一句中的那个:val data: java.util.List[java.util.List[Double]] = new java.util.ArrayList[java.util.List[Double]]().
【解决方案2】:

我的回答适用于 Java,但我想原因是一样的。

您正在将子类型的多态性与泛型混合在一起。确实可以将 ArrayList<T> 分配给 List<T> 变量,但在这里您有一个 List<List<T>> 并且您正在尝试分配一个 ArrayList<ArrayList<T>> 类型的对象。

但是 List<E> 不是 List<F> 的子类型,即使 F 是 E 的子类型,所以这不是直接允许的(不变性),但是 Scala 有 tools 来管理这个问题(因为 Java 有边界和通配符)。

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多