Scala classe não posso substituir o método compare da Interface Java que estende a linguagem java.util.o comparador

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

Pergunta

Atualmente estou trabalhando em um port de um jEdit plugin para escrever todo o código em Scala.No entanto estou forçado em um certo ponto para implementar o meu próprio Comparador.

Meu simplificado de código é o seguinte:

class compare extends MiscUtilities.Compare {
  def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}

O MiscUtilities.Compare tem a seguinte assinatura ao olhar do IntelliJ

public static interface Compare extends java.util.Comparator {        
    int compare(java.lang.Object o, java.lang.Object o1);
}

No entanto, quando eu estou tentando compilar a minha classe, eu recebo um erro dizendo:

erro:classe comparar precisa ser abstrato, uma vez que o método de comparar, em traço de Comparação do tipo (x$1:T,x$2:T)Int não está definido classe comparar estende MiscUtilities.Compare {

Eu também tentei com todas e java.lang.Objeto como tipos, mas não tivemos sorte até agora.

Ajudar é muito apreciado:)

Relação De Stefan

Foi útil?

Solução

Pode ser impossível.Se isso é errado, eu gostaria de saber.

EDITAR:Mas você pode fazer isso em vez disso:

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

Portanto, você ainda tem que escrever algumas Java, mas apenas um trivial classe para cada interface como MiscUtilities.Compare.

Outras dicas

A produção de um autônomo exemplo é o primeiro passo para resolver esses tipos 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  {
       ^

A tentação é a de ampliar Comparator[AnyRef] diretamente de MyCompare, juntamente com Compare:

object MyCompare extends java.util.Comparator[AnyRef] with Compare  {
  def compare(a: AnyRef, b: AnyRef) = 0
}

Mas isso leva a:

error: illegal inheritance;
 self-type MyCompare.type does not conform to java.util.Comparator[AnyRef]'s selftype java.util.Comparator[AnyRef]

Então, eu estou inclinado a concordar que isso não é possível, pelo menos diretamente.Escreva a classe em Java, delegando a Scala, se necessário.

Isso funciona se você colocar [AnyRef] depois de MiscUtilities.Comparar?I. e.,

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

Eu tentei isso com o java.util.Comparador diretamente e o compilador parecia feliz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top