假设我在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())
编译好的。
如何在不必定义此测试功能的情况下实现正确的类型分配?
由于
德
答案 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#B
。 Array
是不变的,所以这不起作用,但有一个诡计:将它包装成协变的东西。
val array: IndexedSeq[A#B] = a.someFunc()
您可以像数组一样使用它,它实际上不会转换任何内容(它是WrappedArray
),如果您真的想要获得toArray
,可以在其上调用Array[A#B]
1}}。
这只是避免做a.someFunc().asInstanceOf[Array[A#B]]
的一招,但当然你可以直接这样做。