Scala определяет класс AnyRef, который после компиляции интерпретируется как класс Java Object. Однако класс 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 и его Dynamic Query API и интерфейсе com.liferay.portal.kernel.dao.orm.Property. Он имеет метод eq(), принимающий объект и возвращающий критерий. Этот код не будет компилироваться в 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