La classe Scala ne peut pas remplacer la méthode de comparaison de l'interface Java qui étend java.util.comparator

StackOverflow https://stackoverflow.com/questions/3329001

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top