스칼라 클래스는 java.util.comparator를 확장하는 Java 인터페이스의 비교 메서드를 재정의할 수 없습니다.
-
29-09-2020 - |
문제
저는 현재 Scala에서 모든 코드를 작성하기 위해 jEdit 플러그인 포트 작업을 하고 있습니다.그러나 나는 어느 시점에서 내 자신의 비교기를 구현하도록 강요 받았습니다.
내 단순화된 코드는 다음과 같습니다.
class compare extends MiscUtilities.Compare {
def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}
IntelliJ에서 보면 MiscUtilities.Compare에는 다음과 같은 서명이 있습니다.
public static interface Compare extends java.util.Comparator {
int compare(java.lang.Object o, java.lang.Object o1);
}
그러나 내 클래스를 컴파일하려고 할 때 다음과 같은 오류가 발생합니다.
오류:(x$1:T,x$2:T)Int가 정의되지 않았습니다 비교 클래스는 MiscUtilities.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
}
.
은 Java를 작성해야하지만 MiscUtilities.Compare
와 같은 각 인터페이스에 대해 하나의 사소한 클래스 만 씁니다.
다른 팁
이러한 종류의 문제를 해결하기 위한 첫 번째 단계는 독립형 예제를 생성하는 것입니다.
~/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]
그래서 나는 이것이 적어도 직접적으로는 불가능하다는 데 동의하고 싶습니다.필요한 경우 Scala에 위임하여 Java로 클래스를 작성합니다.
은 miscutilities.compare 후 [AnyRef]를 넣으면 작동합니까?I.e.,
class Compare extends MiscUtilities.Compare[AnyRef] {
def compare(a1:AnyRef, a2:AnyRef) = 0
}
.
java.util.Comparator에서 직접 해보고 컴파일러가 행복해 보였습니다.