Класс Scala не может переопределить метод сравнения из интерфейса Java, который расширяет java.util.comparator.
-
29-09-2020 - |
Вопрос
В настоящее время я работаю над портом плагина jEdit для написания всего кода на Scala.Однако в какой-то момент я был вынужден реализовать свой собственный компаратор.
Мой упрощенный код выглядит следующим образом:
class compare extends MiscUtilities.Compare {
def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}
MiscUtilities.Compare имеет следующую подпись при просмотре из IntelliJ
public static interface Compare extends java.util.Comparator {
int compare(java.lang.Object o, java.lang.Object o1);
}
Однако, когда я пытаюсь скомпилировать свой класс, я получаю сообщение об ошибке:
ошибка:Сравнение классов должно быть абстрактным, поскольку сравнение методов в признаке Comparator типа (x$1:Т,х$2:T) int не определяется класс Compare Extends RAHUTIONDIENTIONS.compare {
Я также пробовал использовать Any и java.lang.Object в качестве типов, но пока безуспешно.
Помощь очень ценится :)
С уважением Стефан
Решение
Это может быть невозможно .Если это неправильно, я хотел бы знать.
Редактировать: но вы можете сделать это вместо этого:
// 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
}
.
Другие советы
Создание отдельного примера — это первый шаг к решению подобных проблем.
~/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 {
^
Есть искушение продлить Comparator[AnyRef]
прямо из MyCompare
, вместе с Compare
:
object MyCompare extends java.util.Comparator[AnyRef] with Compare {
def compare(a: AnyRef, b: AnyRef) = 0
}
Но это приводит к:
error: illegal inheritance;
self-type MyCompare.type does not conform to java.util.Comparator[AnyRef]'s selftype java.util.Comparator[AnyRef]
Поэтому я склонен согласиться, что это невозможно, по крайней мере напрямую.Напишите класс на Java, при необходимости делегируя его Scala.
Работает ли это, если вы поставите [AnyRef] после цыпочек?Т.е.,
class Compare extends MiscUtilities.Compare[AnyRef] {
def compare(a1:AnyRef, a2:AnyRef) = 0
}
.
Я попробовал это с java.util.comparator напрямую, и компилятор казался счастливым.