2

Java のジェネリック型について質問があります。具体的には、現在、次のようなコードがあります。

public interface Foo {
   public <T> void bar(T[] list)
}

public class FooImpl implements Foo{
   @Override
   public <T extends Comparable<? super T>> void bar(T[] list) {
       ...
   }
}

問題は、FooImpl クラスに bar メソッドを実装していないことをコンパイラが訴えることです。

私が望むのは、ジェネリック型にいくつかの追加の制限を加えることです。具体的には、それらが比較できるようにすることです。しかし、すべての実装がその制限を必要としないため、Foo インターフェースにその制限を入れたくありません。これは可能ですか?修正するにはどうすればよいですか?

よろしくお願いします!

編集 1: クラス --> クラスおよびインターフェイス --> インターフェイスのタイプミスを修正しました。しかし、戻り値の型はまだ void であり、T ではありません。これは無関係だと思います。私の実際の戻り値の型はブール値です。

編集 2: 要求された実際のコード:

public interface SortedCriteria {

    public <E> boolean isSorted(E[] list);

}

public class AscendingCriteria implements SortedCriteria {

    @Override
    public <E extends Comparable<? super E>> boolean isSorted(E[] list) {
        int length = list.length;
        for (int i = 1; i < length; i++) {
            if (list[i].compareTo(list[i-1]) < 0) return false;
        }
        return true;
    }

}
4

1 に答える 1

1

ポリモーフィズムが完全に壊れてしまうため、やりたいことは拒否されます。Foo インスタンスを持つ呼び出し元は、サブクラスのインスタンスまたは他のサブクラスのインスタンスを持つことができます。また、インターフェイスはメソッドを引数として任意の種類の配列で呼び出すことができることを保証するため、サブクラスは、受け入れる配列の種類を制限することによってこの契約を破ることはできません (配列の型をチェックすることによって実行時にそれを行う場合を除きます)。もちろん、例外をスローすることによって)。

これは、ポリモーフィズムとオブジェクト指向の基礎であるリスコフ置換原理に要約されます。

しかし、実際に必要なのは Foo をジェネリック型にすることかもしれません:

public interface Foo<T> {
    public void bar(T[] list);
}

public class FooImpl<T extends Comparable<? super T>> implements Foo<T> {
   @Override
   public void bar(T[] list) {
       ...
   }
}
于 2014-02-09T12:04:11.480 に答える