加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala中的Java泛型方法

发布时间:2020-12-16 09:57:40 所属栏目:安全 来源:网络整理
导读:我在这个例子中遇到了解 Scalac错误消息的问题: Bean.java public class Bean { static public class AttributeT { public final String name; public Attribute(String name) {this.name = name;} // equals and hashcode omitted for simplicity } public
我在这个例子中遇到了解 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读