gpt4 book ai didi

scala - 使用 Scala 的 Java 泛型方法

转载 作者:行者123 更新时间:2023-12-04 18:09:31 24 4
gpt4 key购买 nike

在此示例中,我在理解 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);
}
}

编译产生这个(用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 之间的不匹配造成的和斯卡拉 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)

关于scala - 使用 Scala 的 Java 泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com