Scala definisce una classe AnyRef che è dopo la compilazione interpretato un po 'come classe Object di Java. La classe AnyRef, tuttavia, non è esattamente equivalente a Object dal punto di vista della lingua, perché introduce diversi nuovi metodi, come eq(), che accetta AnyRef e restituisce Boolean e confronta i riferimenti per l'identitàCome chiamare il metodo T eq (Object) dell'interfaccia Java da Scala?
Se c'è una classe in Java che si definisce il metodo eq() con un diverso tipo di risultato e un'interfaccia che questa classe implementa anche avendo questo metodo:
public interface I {
String eq(Object that);
}
public class A implements I {
public String eq(Object that) {return "";}
}
quindi il suo metodo eq diventa inaccessibile al codice Scala se chiamato tramite interfaccia di riferimento
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
Il metodo eq Scala conosce qui è il metodo eq dalla classe AnyRef essere "incollato" per interfacciare I, che è venuto da Java senza quel metodo, ma con un metodo eq() della propria con un diverso tipo di risultato. posso spiegare questo comportamento, ma non può risolvere il compito di vita reale quando devo chiamare il metodo questo Java eq() senza un possiblity per modificare il codice della libreria di terze parti Java. Vale a dire che sto parlando di Liferay e le sue API Query dinamica e l'interfaccia denominata com.liferay.portal.kernel.dao.orm.Property. Ha un metodo eq() che accetta Object e restituisce Criterion. Questo codice non verrà compilato in Scala:
val query = DynamicQueryFactoryUtil.forClass(classOf[BookmarksEntry])
.add(PropertyFactoryUtil.forName("folderId").eq(new Long(folderId)))
perché eq non verrà interpretato correttamente. Solo per citare, la classe Property ha un altro overload del metodo eq() che prende come parametro DynamicQuery. Questo sovraccarico è accessibile da Scala.
Sapete di un modo per chiamare quel metodo eq (Object) di interfaccia Java da Scala?
versione Scala utilizzata è 2.8.1
Hai provato 'A.EQ (b.asInstanceOf [Object])'? –
Funziona per me, nessun errore di compilazione e viene chiamato il metodo corretto. – Lex
Sfortunatamente non aiuta.Ho aggiornato la descrizione, c'è anche un'interfaccia che gioca un ruolo qui – kyrel