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

如何从Scala调用Java接口的T eq(Object)方法?

发布时间:2020-12-16 09:09:56 所属栏目:安全 来源:网络整理
导读:Scala定义了一个AnyRef类,它在编译后被稍微解释为 Java的Object类.然而,AnyRef类从语言的角度来看并不完全等同于Object,因为它引入了几个新的方法,如eq(),它使用AnyRef并返回布尔值,并比较引用的身份 如果Java中有一个类,它本身定义了具有不同结果类型的eq()
Scala定义了一个AnyRef类,它在编译后被稍微解释为 Java的Object类.然而,AnyRef类从语言的角度来看并不完全等同于Object,因为它引入了几个新的方法,如eq(),它使用AnyRef并返回布尔值,并比较引用的身份

如果Java中有一个类,它本身定义了具有不同结果类型的eq()方法,以及该类实现的具有此方法的接口:

public interface I {
    String eq(Object that);
}

public class A implements I {
    public String eq(Object that) {return "";}
}

那么如果通过接口引用调用,则其eq方法变得无法访问Scala代码

val i: I = new A
val a = new A
val b = Some(1)           //whatever actually
val s1: String = a.eq(b)   //compiles OK
val s2: String = i.eq(b)   //compilation error

这个方法Scala知道这里是从AnyRef类“粘贴”到接口I的eq方法,没有这种方法来自Java,而是使用自己的不同结果类型的eq()方法.
我可以解释这个行为,但是当我不得不调用这个Java eq()方法来修改Java第三方库的代码时,我无法解决现实生活中的任务.
就是说我在说Liferay及其动态查询API和名为com.liferay.portal.kernel.dao.orm.Property的界面.它有一个eq()方法获取Object并返回Criterion.此代码不会在Scala中编译:

val query = DynamicQueryFactoryUtil.forClass(classOf[BookmarksEntry])
.add(PropertyFactoryUtil.forName("folderId").eq(new Long(folderId)))

因为eq将不会被正确解释.
只要提及,Property类又有一个重载的eq()方法,它以DynamicQuery为参数.这个重载可以从Scala访问.

你知道有什么办法从Scala中调用Java接口的eq(Object)方法吗?

使用的Scala版本是2.8.1

解决方法

有趣的问题:我以前没看过这个.我不知道如何在Scala中解决这个问题,或者甚至是可能的.然而,在这种情况下,您最好可以使用Java创建一个包装器.例如:

public class Eq {
    static public String eq(I obj,Object that) {
        return obj.eq(that);
}

然后,您可以调用Eq.eq(x,y)而不是x.eq(y).

(编辑:李大同)

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

    推荐文章
      热点阅读