2

ジェネリックに関連する次の問題があります。私は次のものを持っています:

InterfaceA として:

public interface InterfaceA {
    public <T extends DTOInterface> Object methodName (T dto) {}
}

DTOInterface は単なる空のインターフェースです。

次に、私の実装は次のようになります。

public class ImplementationA implements InterfaceA {
    public Object methodName(DTOImplementation dto) {
        return null;
    }
}

DTOImplementation は、DTOInterface を実装する単なるクラスです。

これは、ImplementationA のメソッドが InterfaceA のメソッドの有効な実装として認識されないため、失敗しています。

ただし、インターフェイスレベルでパラメーターを定義すると、つまり

public interface InterfaceA **<T extends DTOInterface>** {
    public Object methodName (T dto) {}
}

次に、実装を次のように定義します。

public class ImplementationA implements **InterfaceA<DTOImplementation>** {
    public Object methodName(DTOImplementation dto) {
        return null;
    }
}

それは機能します。メソッドは有効な実装として認識されます。

なぜこれが起こっているのか誰にも分かりますか?

4

2 に答える 2

4

最初の宣言は、 を実装するためにInterfaceA、サブクラスは、メソッド呼び出し元の選択を拡張methodNameする任意の型に対して機能するメソッドを提供する必要があることを示しています。つまり、の呼び出し元が選択できるパラメーターです。実装するクラスはそれを選択できません。そのため、 forの特定の値を選択してそれのみを実装しようとする実装を提供すると、コンパイラはプログラムを拒否します。TDTOInterface TmethodNameInterfaceATmethodName

一方、2 番目の宣言は、実装者が特定の値を提供し、Tその特定の選択に対するメソッドのみを実装できるようにするインターフェイスです。(つまり、 )の 1 つの特定のサブタイプに対してのみImplementationA実装することを選択し、その選択の に対してのみメソッドを提供します。それはまったく問題ありません。InterfaceADTOInterfaceDTOImplementationT

于 2013-10-04T11:34:26.997 に答える