我在这个例子中遇到了解
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"); }
Test.scala
object Test { def test() { val bean = new Bean(); bean.set(Bean.AGE,2L); } }
编译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
为什么需要属性[Any]?
在Java中做同样的工作正常
谢谢
解决方法
该错误是由于java.lang.Long和scala Long之间不匹配造成的.
Bean.AGE的类型为Bean.Attribute [java.lang.Long].因此,scala编译器期望java.lang.Long作为另一个参数.但是你传递的是2L,这是scala.Long而不是java.lang.Long.因此它显示错误.
这样做会按预期工作:
b.set(Bean.AGE,new java.lang.Long(23))
感谢@senia,以下是更好的选择:
bean.set[java.lang.Long](Bean.AGE,23) bean.set(Bean.AGE,23:java.lang.Long)