如何实现Java方法返回在Scala中使用数组参数化的泛型类型?

时间:2015-11-21 16:51:19

标签: java scala

我在Java中有以下方法的接口:

<E> Encoder1<E[]> arrayArg(Encoder1<? super E> elemEncoder);

我尝试使用以下声明在Scala中实现它:

override def arrayArg[E](elemEncoder: Encoder1[_ >: E]): Encoder1[Array[E]]

我收到以下错误:

Error:(38, 16) overriding method arrayArg in trait Encoders of type [E](elemEncoder: redradishes.encoder.expr.Encoder1[_ >: E])redradishes.encoder.expr.Encoder1[Array[E with Object]];
 method arrayArg has incompatible type
  override def arrayArg[E](elemEncoder: Encoder1[_ >: E]): Encoder1[Array[E]] = ???
               ^

我的Scala方法签名有什么问题?

1 个答案:

答案 0 :(得分:1)

请看这个: https://issues.scala-lang.org/browse/SI-4390

我不确定我是否完全理解为什么,但您需要在返回值中指定E with Object才能进行编译。该错误会告诉您这一点。可能这是因为在java中你不能使用原始类型(AnyVal)作为泛型参数,但是在scala中你可以这样,你需要指定E扩展Object以使它与Java对齐规则。我仍然不确定为什么这种情况如此特殊。

如果您对Object感到不舒服,E with AnyRef似乎也有效。