Scala определяет класс AnyRef, который после компиляции интерпретируется как класс объектов Java. Класс AnyRef, однако, не совсем эквивалентен Object с точки зрения языка, потому что он вводит несколько новых методов, таких как eq (), который принимает AnyRef и возвращает Boolean и сравнивает ссылки на идентичность
Если в 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
Метод eq, о котором Scala знает здесь, это метод eq из класса AnyRef, который «приклеивается» к интерфейсу I, пришедший из Java без этого метода, но с собственным методом eq () с другим типом результата.
Я могу объяснить это поведение, но не могу решить реальную задачу, когда мне нужно вызвать этот метод Java eq () без возможности изменить код сторонней библиотеки Java.
А именно, я говорю о Liferay и его API динамических запросов и интерфейсе с именем com.liferay.portal.kernel.dao.orm.Property. У него есть метод eq (), принимающий Object и возвращающий критерий. Этот код не будет компилироваться в Scala:
val query = DynamicQueryFactoryUtil.forClass(classOf[BookmarksEntry])
.add(PropertyFactoryUtil.forName("folderId").eq(new Long(folderId)))
потому что eq не будет правильно интерпретирован.
Отметим, что у класса Property есть еще одна перегрузка метода eq (), которая принимает DynamicQuery в качестве параметра. Эта перегрузка доступна из Scala.
Вам известен способ вызова этого метода eq (Object) интерфейса Java из Scala?
Используемая версия Scala - 2.8.1
.