从嵌套类的Java数组转换为scala数组

时间:2013-10-29 12:50:56

标签: java scala

假设我在java中定义了以下类:

public class A
{
  public class B
  {
  }

  public B[] someFunc() {...}
}

我正试图在scala中访问它,如下所示:

val array: Array[A#B] = a.someFunc()

编译器给出了以下警告:

*类型不匹配; found:Array [aB] required:Array [A#B]注意:aB<:A#B,但类Array在类型T中是不变的。您可能希望研究一个通配符类型,例如`_&lt ;: A# B *

我不确定我应该使用正确的语法来克服这个错误。我尝试使用以下但不会编译:

val array: Array[T <: A#B] = a.someFunc()

但我已经找到通过将其传递给函数来解决问题:

def test[T <: A#B](array: Array[T]) = ...
test(a.someFunc())
编译好的

如何在不必定义此测试功能的情况下实现正确的类型分配?

由于

1 个答案:

答案 0 :(得分:1)

您的B内部类未标记为 static ,这意味着,从scala的角度来看,它不是伴随对象的成员(即静态成员)A#B但它是实例化对象本身的成员a.B

所以你应该以这种方式声明你的价值:

val array: Array[a.B] = a.someFunc()

或者让类型推断来做:

val array = a.someFunc() // typed as Array[a.B]

修改:如果您没有对a的引用,通常您可以将a.B转发为A#BArray是不变的,所以这不起作用,但有一个诡计:将它包装成协变的东西。

val array: IndexedSeq[A#B] = a.someFunc()

您可以像数组一样使用它,它实际上不会转换任何内容(它是WrappedArray),如果您真的想要获得toArray,可以在其上调用Array[A#B] 1}}。

这只是避免做a.someFunc().asInstanceOf[Array[A#B]]的一招,但当然你可以直接这样做。