Scalaクラスは、java.util.comparatorを拡張するJavaインタフェースから比較メソッドをオーバーライドする
-
29-09-2020 - |
質問
現在、JEDITプラグインのポートに取り組んで、Scalaですべてのコードを書き込む。しかし、私の比較器を実装するために特定の点で強制されます。
私の簡素化されたコードは次のとおりです:
class compare extends MiscUtilities.Compare {
def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}
.
Intellij
から見ると、次の署名があります。public static interface Compare extends java.util.Comparator {
int compare(java.lang.Object o, java.lang.Object o1);
}
.
しかし、私のクラスをコンパイルしようとしているとき、私はエラーが言われます:
エラー:クラス比較は抽象化する必要があるため、Type(X $ 1:T、X $ 2:T)INTは定義されていません。 クラス比較Moctilities.compare {
私はまた、Any and java.lang.Objectをタイプとして試してみましたが、これまでの運もなかった。
ヘルプはとても感謝しています:)
Stefan
を扱います解決
不可能。これが間違っているならば、私は知りたいのです。
// 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
から直接拡張することです。
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]を置くとうまくいきますか?すなわち
class Compare extends MiscUtilities.Compare[AnyRef] {
def compare(a1:AnyRef, a2:AnyRef) = 0
}
.
私はjava.util.comparatorで直接それを試してみました、そしてコンパイラは幸せに見えました。
所属していません StackOverflow