epr*_*rst 5 generics scala scala-java-interop
我在这个例子中遇到了解Scalac错误消息的问题:
Bean.java
public class Bean {
static public class Attribute<T> {
public final String name;
public Attribute(String name) {this.name = name;}
// equals and hashcode omitted for simplicity
}
public <T> void set(Attribute<T> attribute, T value) {}
public static Attribute<Long> AGE = new Attribute<Long>("age");
}
Run Code Online (Sandbox Code Playgroud)
Test.scala
object Test {
def test() {
val bean = new Bean();
bean.set(Bean.AGE, 2L);
}
}
Run Code Online (Sandbox Code Playgroud)
编译yeilds this(尝试用scalac 2.9.2):
Test.scala:4: error: type mismatch;
found : Bean.Attribute[java.lang.Long]
required: Bean.Attribute[Any]
Note: java.lang.Long <: Any, but Java-defined class Attribute is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
bean.set(Bean.AGE, 2L);
^
one error found
Run Code Online (Sandbox Code Playgroud)
为什么需要属性[Any]?在Java中做同样的工作正常
谢谢
该错误是由于java.lang.Longscala和scala 之间的不匹配造成的Long.
Bean.AGE是类型的Bean.Attribute[java.lang.Long].因此,scala编译器期望a java.lang.Long作为另一个参数.但你传球的是2L哪个scala.Long而不是java.lang.Long.因此它显示错误.
这样做会按预期工作:
b.set(Bean.AGE,new java.lang.Long(23))
Run Code Online (Sandbox Code Playgroud)
感谢@senia,以下是更好的选择:
bean.set[java.lang.Long](Bean.AGE, 23)
bean.set(Bean.AGE, 23:java.lang.Long)
Run Code Online (Sandbox Code Playgroud)