【问题标题】:Scala working with Java libraries not specifying collections' type parametersScala 使用 Java 库未指定集合的​​类型参数
【发布时间】:2013-10-04 13:14:20
【问题描述】:

我正在使用一些旧的 Java 库,这些库使用未在 Scala 中指定类型参数的集合(例如 Eclipse draw2d)。

假设你有一个这样的 java 类(你不能修改):

// A.java
package com.example.test;
import java.util.ArrayList;

public class A extends ArrayList {}  // not ArrayList<Object>, just ArrayList

如果你想在 Java 中使用 A 类,你可以这样做:

// B.java
import com.example.test.A;

public class B {
  public static void main(String[] args) {
    A a = new A();
    a.add(1);
  }
}

javac B.java 成功并带有一些警告:

Note: C.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

然而,与 Scala 相同的东西是不可能的:

// C.scala
import com.example.test.A

object C {
  def main(args: Array[String]): Unit = {
    val a = new A()
    a.add(1)
  }
}

scalac C.scala 发出错误:

C.scala:6: error: type mismatch;
 found   : Int(1)
 required: E
    a.add(1)
          ^

如何在 Scala 中使用这个类?

【问题讨论】:

    标签: java scala generics


    【解决方案1】:

    那么你可以做的是:

    val a = new A
    val ls = a.asInstanceOf[java.util.List[Any]]
    ls.add(1)
    

    但同样,您将无法使用A 中的其他方法。我仍然不确定您将如何访问A 方法。参考资料(在更改日志中说):

    Java 中的原始类型(例如 ArrayList)被转换为 ArrayList[_], 这是 ArrayList[T] forSome { type T }

    的简写

    因此,scala 编译器总是将其视为A extends ArrayList[E] forSome {type E},并且不确定如何转义该类型(在编译时)。

    【讨论】:

      【解决方案2】:

      我找到了解决办法:

      // C.scala
      import com.example.test.A
      import java.util.ArrayList
      
      object C {
        def main(args: Array[String]): Unit = {
          val a = new A()
          a.asInstanceOf[ArrayList[Any]].add(1)    // a.add(1)
          println(a.size())
        }
      }
      

      这段代码解决了问题!

      但我仍然想知道 ArrayList[Nothing] -&gt; ArrayList[Any] 转换如何在 Scala 中实现,而 Array 是不变的。此外,Scala 也接受ArrayList[Any] -&gt; ArrayList[Nothing] 转换!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多