Scala define una clase AnyRef que luego de la compilación se interpreta como la clase Object de Java. La clase AnyRef, sin embargo, no es exactamente equivalente a Object desde el punto de vista del lenguaje, ya que introduce varios métodos nuevos, como eq(), que toma AnyRef y devuelve Boolean y compara referencias para la identidadCómo llamar al método T eq (Object) de la interfaz Java desde Scala?
Si hay una clase en Java que a su vez define el método eq() con un tipo de resultado diferente y una interfaz que esta clase implementa teniendo también este método:
public interface I {
String eq(Object that);
}
public class A implements I {
public String eq(Object that) {return "";}
}
entonces su método eq vuelve inaccesible a código Scala si se llama a través de referencia de interfaz
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
El método eq que Scala conoce aquí es el método eq de la clase AnyRef que está "pegado" a la interfaz I que proviene de Java sin ese método, pero con un método eq() propio con un tipo de resultado diferente. Puedo explicar este comportamiento, pero no puedo resolver la tarea de la vida real cuando tengo que llamar a este método Java eq() sin la posibilidad de modificar el código de la biblioteca Java de terceros. A saber, estoy hablando de Liferay y su Dynamic Query API y la interfaz llamada com.liferay.portal.kernel.dao.orm.Property. Tiene un método eq() que toma Object y Return Criterion. Este código no se compilará en Scala:
val query = DynamicQueryFactoryUtil.forClass(classOf[BookmarksEntry])
.add(PropertyFactoryUtil.forName("folderId").eq(new Long(folderId)))
porque eq no se interpretará correctamente. Solo para mencionar, la clase Propiedad tiene otra sobrecarga del método eq() que toma DynamicQuery como parámetro. Esta sobrecarga es accesible desde Scala.
¿Conoces alguna forma de llamar a ese método eq (Object) de la interfaz Java desde Scala?
versión 2.8.1 Scala utilizado es
¿Usted intentó 'A.EQ (b.asInstanceOf [Objeto])'? –
Funciona para mí, no hay error de compilación, y se llama al método correcto. – Lex
Desafortunadamente no ayuda.He actualizado la descripción, también hay una interfaz desempeñando un papel aquí – kyrel