インターフェイスのみを使用して特定のクラスを呼び出しています。問題は、クラス自体がComparableを実装していることですが、別のインターフェイスを介してクラスを参照しているため、コンパイラはComparableを実装していることを認識していません。これには簡単な解決策があると確信しています...しかし、私は今それを考えることができません。
5 に答える
インターフェイスを実装するすべてのものも実装しComparable<T>ますか?もしそうなら、私はあなたがただインターフェースを拡張するようにすることを提案しますComparable<T>。
それ以外の場合は、このComparable<T>場合は機能することがわかっている場合は、キャストすることができます。もちろん、これはコンパイル時の型の安全性をいくらか失いますが、それは獣の性質です。
これは私には奇妙に思えます...次のようなメインがある場合は、以下の親インターフェイスと子クラスで動作させることができます...しかし、ChildAとChildBを比較してみることができるという奇妙な点があります。おそらく意味がありません。
たぶん、クラス/インターフェースが何をしているのかについてのヒントを私たちに与えれば、私たちはより良い答えを与えることができます。
public class Main
{
public static void main(final String[] argv)
{
Parent x;
Parent y;
x = new ChildA();
y = new ChildA();
x.compareTo(y);
}
}
abstract interface Parent
extends Comparable<Parent>
{
}
class ChildA
implements Parent
{
public int compareTo(Parent o)
{
throw new UnsupportedOperationException("Not supported yet.");
}
}
class ChildB
implements Parent
{
public int compareTo(Parent o)
{
throw new UnsupportedOperationException("Not supported yet.");
}
}
代わりにComapartorを使用することをお勧めします。sort(list、Comparator)を使用できます。コンパレータの実装は、クラスをComparableにキャストし、そのcompareメソッドを使用します。したがって、コンパイラは満足し、compareメソッドの既存の実装を再利用します。
あなたはいくつかの気紛れなジェネリックを行うことができます。メインインターフェイスがLickable(メソッドを定義するlick())であり、とであるオブジェクトを処理するメソッドが必要だとしLickableますComparable。あなたが書く:
public <LickableAndComparable extends Lickable & Comparable<LickableAndComparable>> void lickGreater(LickableAndComparable a, LickableAndComparable b) {
if (a.compareTo(b) > 0) a.lick();
else b.lick();
}
Lickable次に、との両方である任意のタイプのオブジェクトを使用してそれを呼び出すことができますComparable。両方の引数が、それ自体の両方である型を共有する場合にのみ機能することに注意してくださいLickable。Comparableクラスが1つしかない場合は、これで問題ありません。メソッドの使用法が複雑になると、片頭痛を引き起こすコンパイラエラーが発生する可能性があります。
同等のインターフェースには注意が必要です。一般に、インターフェースをそれ自体と比較可能としてマークした場合、正しい実装では、このインターフェースのメソッドのみを使用して比較を実行できます。そうでなければ、この関係を反対称にすることはできません-一貫した順序を持つために必要な条件です。
したがって、インターフェイスを比較可能としてマークする前に、よく考えてください。
ただし、インターフェイスのさまざまな実装を混在させていないことが確実な場合は、回避策があります。
interface Foo {
}
interface Bar extends Foo, Comparable<Bar> {
}
class FooComparator<T extends Foo & Comparable<T>> implements Comparator<T> {
@Override
public int compare(T arg0, T arg1) {
return arg0.compareTo(arg1);
}
}