3

假设我在 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 中是不变的。您可能希望研究通配符类型,例如 `_ <: A#B*

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

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

但是我发现通过将它传递给一个函数来解决这个问题:

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

编译得很好。

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

谢谢

德斯

4

1 回答 1

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()

你可以像使用数组一样使用它,它实际上并不转换任何东西(它是 a WrappedArray),toArray如果你真的想得到一个Array[A#B].

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

于 2013-10-29T13:19:31.367 回答