Scala定义了一个AnyRef类,它在编译之后被解释为Java的Object类。但是,从语言的角度来看,AnyRef类并不完全等同于Object,因为它引入了几个新方法,如eq(),它采用AnyRef并返回布尔值并比较标识的引用如何从Scala调用Java接口的T eq(Object)方法?
如果在Java类本身定义了不同的结果类型和该类实现也具有这种方法的接口的当量()方法:
public interface I {
String eq(Object that);
}
public class A implements I {
public String eq(Object that) {return "";}
}
然后其当量方法变得不可访问到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知道的eq方法是来自AnyRef类的eq方法,该方法被“粘贴”到来自Java的接口I,而没有使用该方法,但使用自己的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类具有以DynamicQuery作为参数的eq()方法的另一个重载。这个过载可以从Scala访问。
你知道有什么方法可以从Scala调用Java接口的eq(Object)方法吗?使用
的Scala版本是2.8.1
你尝试'a.eq(b.asInstanceOf [对象])':
FWIW,你可以做到吗? –
适用于我,没有编译错误,并调用正确的方法。 – Lex
不幸的是,它并没有帮助。我更新了描述,还有一个界面在这里扮演角色 – kyrel