【发布时间】:2011-08-31 21:47:24
【问题描述】:
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 "";}
}
如果通过接口引用调用,Scala 代码将无法访问其 eq 方法
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 在这里知道的 eq 方法是 AnyRef 类中的 eq 方法被“粘合”到接口 I,它来自 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
【问题讨论】:
-
你试过
a.eq(b.asInstanceOf[Object])吗? -
对我有用,没有编译错误,并且调用了正确的方法。
-
不幸的是它没有帮助。我更新了描述,这里还有一个界面在起作用
-
@Lex,抱歉,已解决问题,感谢您的努力
-
我不是反思方面的专家,但您能以这种方式获得这种方法吗?