如何从Scala调用Java接口的T eq(Object)方法?
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()方法. val query = DynamicQueryFactoryUtil.forClass(classOf[BookmarksEntry]) .add(PropertyFactoryUtil.forName("folderId").eq(new Long(folderId))) 因为eq将不会被正确解释. 你知道有什么办法从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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |