La clase Scala no puede anular el método de comparación de la interfaz Java que extiende java.util.comparator
-
29-09-2020 - |
Pregunta
Actualmente estoy trabajando en una adaptación de un complemento jEdit para escribir todo el código en Scala.Sin embargo, en cierto momento me veo obligado a implementar mi propio Comparador.
Mi código simplificado es el siguiente:
class compare extends MiscUtilities.Compare {
def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}
MiscUtilities.Compare tiene la siguiente firma cuando se mira desde IntelliJ
public static interface Compare extends java.util.Comparator {
int compare(java.lang.Object o, java.lang.Object o1);
}
Sin embargo, cuando intento compilar mi clase, aparece un error que dice:
error:La comparación de clases debe ser abstracta, ya que el método de comparación en el rasgo Comparador de tipo (x$1:Tx$2:T) int no está definida la clase compare extiende las misiescuitilidades.
También probé con Any y java.lang.Object como tipos, pero hasta ahora no tuve suerte.
Se aprecia mucho la ayuda:)
Saludos Stefan
Solución
Puede ser imposible .Si esto está mal, me gustaría saber.
Editar: Pero puedes hacer esto en su lugar:
// 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
}
Otros consejos
Producir un ejemplo independiente es el primer paso para resolver este tipo de problemas.
~/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 tentación es extender Comparator[AnyRef]
directamente desde MyCompare
, junto con Compare
:
object MyCompare extends java.util.Comparator[AnyRef] with Compare {
def compare(a: AnyRef, b: AnyRef) = 0
}
Pero esto lleva a:
error: illegal inheritance;
self-type MyCompare.type does not conform to java.util.Comparator[AnyRef]'s selftype java.util.Comparator[AnyRef]
Así que me inclino a estar de acuerdo en que esto no es posible, al menos directamente.Escriba la clase en Java, delegándola a Scala si es necesario.
¿Funciona si pones [Anyref] después de Milestivies.compare?Es decir,
class Compare extends MiscUtilities.Compare[AnyRef] {
def compare(a1:AnyRef, a2:AnyRef) = 0
}
Lo intenté con java.util.comparator directamente y el compilador parecía feliz.