Класс Scala не может переопределить метод сравнения из Java Interface, который расширяет java.util.comparator - PullRequest
5 голосов
/ 25 июля 2010

В настоящее время я работаю над портом плагина 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);
}

Однако, когда я пытаюсь скомпилировать мой класс, я получаю сообщение об ошибке:

error: сравнение классов должно быть абстрактным, так как метод сравнения в черте Comparator типа (x $ 1: T, x$ 2: T) Int не определено. Сравнение классов расширяет MiscUtilities.Compare {

Я также пробовал использовать Any и java.lang.Object как типы, но пока не повезло.

Справкаочень ценится:)

С уважением, Стефан

Ответы [ 3 ]

6 голосов
/ 25 июля 2010

Это может быть невозможно . Если это не так, я хотел бы знать.

РЕДАКТИРОВАТЬ: Но вы можете сделать это вместо:

// 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
}

Так что вам все еще нужно написать немного Java, но только один тривиальный класс для каждого интерфейса, например MiscUtilities.Compare.

2 голосов
/ 25 июля 2010

Создание отдельного примера - первый шаг к решению подобных проблем.

 ~/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, если это необходимо.

1 голос
/ 25 июля 2010

Работает ли это, если вы поставите [AnyRef] после MiscUtilities.Compare?Т.е.,

class Compare extends MiscUtilities.Compare[AnyRef] {   
  def compare(a1:AnyRef, a2:AnyRef) = 0       
}

Я попробовал это с java.util.Comparator напрямую, и компилятор выглядел счастливым.

...