2

私はこのインターフェースを持っています:

interface MyInt<T> {

    public void foo(T t);
}

そして、これらのクラス:

class MyString implements MyInt<String> {

    @Override
    public void foo(String t) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

class MyDouble implements MyInt<Double> {

    @Override
    public void foo(Double t) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

MyIntクラスが実装するだけでなく(私はそれを行うことができます)、そのクラスが実装するかどうか、MyInt<String>これまでの私のコードをテストしたいと思います:

Class<MyInt> c = MyInt.class;
Class c0 = MyString.class;
Class c1 = MyDouble.class;

System.out.println(c.isAssignableFrom(c0)); //true
System.out.println(c.isAssignableFrom(c1)); //true

文字列「sublass」を追加しようとするたびに (T の正しい名前さえ知らない)、コンパイル エラーが発生します。これを行う方法はありますか?

4

1 に答える 1

2

クラスが MyInt を実装しているだけでなく、そのクラスが MyInt<String> を実装しているかどうかをテストしたい

あなたは次のようなことをしたいかもしれません

Class<MyInt<String> > c = MyInt<String>.class;

しかし、これは型消去のために不可能です。Java: ジェネリック型からクラス リテラルを取得するにはどうすればよいですか? を参照してください。非常に良い説明のために。

クラスが特定の型を使用するインターフェイスを実装しているかどうかを引き続き確認できるようにするには、特定のクラスのジェネリック型引数を取得して、その型を確認します。

Class c0 = MyString.class;
Class c1 = MyDouble.class;

ParameterizedType c0Type = (ParameterizedType) c0.getGenericInterfaces()[0];
Class<?> type0Class = (Class<?>) c0Type.getActualTypeArguments()[0];

ParameterizedType c1Type = (ParameterizedType) c1.getGenericInterfaces()[0];
Class<?> type1Class = (Class<?>) c1Type.getActualTypeArguments()[0];

System.out.println(type0Class.isAssignableFrom(String.class));  // true
System.out.println(type1Class.isAssignableFrom(String.class));  // false

これは、特定のケースで機能するはずです。複数のインターフェイスを実装している場合や、複数のジェネリック型パラメーターを使用している場合は、配列インデックスを調整する必要があります。

于 2013-06-12T13:46:23.667 に答える