Scala,无法实现泛型java方法

Gar*_*lon 7 java generics methods scala implements

我想实现一个在scala中使用泛型的java方法(2.9.2).但是我失败了......

Java接口方法:

public <T extends Number> void setAttribute(Key<T> key, Number value);
Run Code Online (Sandbox Code Playgroud)

想要实现该方法的Scala代码:

def setAttribute[T <: Number](key: Key[T], value: Number) = {
  setAttributeLocal(key, value)  }

private def setAttributeLocal[T](key: Key[T], value: T) = {
  val stringValue = ConvertUtils.convert(value, classOf[String]).asInstanceOf[String]
  session = session + (key.getValue() -> stringValue)
}
Run Code Online (Sandbox Code Playgroud)

关键看起来像:

public class Key<T>
Run Code Online (Sandbox Code Playgroud)

但这不编译.

[error]  found   : mypackage.Key[T]
[error]  required: mypackage.Key[java.lang.Number]
[error] Note: T <: java.lang.Number, but Java-defined class Key is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ <: java.lang.Number`. (SLS 3.2.10)
[error]     setAttributeLocal(key, value)
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚问题是什么.有什么建议/想法吗?

格雷兹加菲尔德克朗

Ben*_*ulz 4

看来编译器对您对 的调用不满意setAttributeLocalsetAttributeLocal需要 a Key[Number],但您提供的是Key[_ <: T]. 在 Java 领域,这意味着您试图Key<? extends Number>Key<Number>.

建议使用setAttributeLocalAcceptKey<? extends Number>Key[_ <: Number],具体取决于它是 Java 还是 Scala 定义的。