La classe Scala ne peut pas remplacer la méthode de comparaison de l'interface Java qui étend java.util.comparator
-
29-09-2020 - |
Question
Je travaille actuellement sur un portage d'un plugin jEdit pour écrire tout le code en Scala.Cependant, je suis obligé à un moment donné d'implémenter mon propre comparateur.
Mon code simplifié est le suivant :
class compare extends MiscUtilities.Compare {
def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}
Le MiscUtilities.Compare a la signature suivante lorsque vous regardez depuis IntelliJ
public static interface Compare extends java.util.Comparator {
int compare(java.lang.Object o, java.lang.Object o1);
}
Cependant, lorsque j'essaie de compiler ma classe, j'obtiens une erreur disant :
erreur:la comparaison de classe doit être abstraite, car la méthode compare dans le trait Comparateur de type (x$1 :T,x$2 :T) int n'est pas défini la classe compare étend les diverses contactions.compare {
J'ai également essayé avec Any et java.lang.Object comme types, mais pas de chance jusqu'à présent.
L'aide est très appréciée :)
Cordialement Stéphane
La solution
C'est possible impossible.Si c'est faux, j'aimerais le savoir.
MODIFIER:Mais vous pouvez faire ceci à la place :
// CompareImpl.java
abstract class CompareImpl implements MiscUtilities.Compare {
public int compare(Object o, Object o1) {
return doCompare(o, o1);
}
public abstract int doCompare(Object o, Object o1);
}
// MyCompare.scala
object MyCompare extends CompareImpl {
def doCompare(a: AnyRef, b: AnyRef) = 0
}
Vous devez donc encore écrire du Java, mais une seule classe triviale pour chaque interface comme MiscUtilities.Compare
.
Autres conseils
Produire un exemple autonome est la première étape pour résoudre ce type de problèmes.
~/code/scratch/raw: cat Compare.java
interface Compare extends java.util.Comparator {
}
~/code/scratch/raw: cat MyCompare.scala
object MyCompare extends Compare {
def compare(a: AnyRef, b: AnyRef) = 0
}
~/code/scratch/raw: scalac MyCompare.scala Compare.java
MyCompare.scala:1: error: object creation impossible, since method compare in trait Comparator of type (x$1: T,x$2: T)Int is not defined
object MyCompare extends Compare {
^
La tentation est de prolonger Comparator[AnyRef]
directement de MyCompare
, avec Compare
:
object MyCompare extends java.util.Comparator[AnyRef] with Compare {
def compare(a: AnyRef, b: AnyRef) = 0
}
Mais cela conduit à :
error: illegal inheritance;
self-type MyCompare.type does not conform to java.util.Comparator[AnyRef]'s selftype java.util.Comparator[AnyRef]
Je suis donc enclin à convenir que ce n’est pas possible, du moins directement.Écrivez la classe en Java, en déléguant à Scala si besoin est.
Est-ce que cela fonctionne si vous mettez [Anyref] après erreur?C'est-à-dire
class Compare extends MiscUtilities.Compare[AnyRef] {
def compare(a1:AnyRef, a2:AnyRef) = 0
}
J'ai essayé cela avec Java.Util.comParator directement et le compilateur semblait heureux.