2011-08-11 11 views
2

私はサブクラスを持つジェネリッククラスを持っています。Javaのワイルドカード、ジェネリック、セッター、ゲッター

GenericClass<?> obj1 = ... // has a value here 
GenericClass<?> obj2 = ... // has a value here 

// I know that obj1 is the same type of obj2 but I don't know this type. 
obj1.setValue(obj2.getValue()); 

最後の行は、コンパイルエラーを生成:

を、私は何のサブクラスを知らなくても、サブクラスを使用しますが、私はこの2つのサブクラスが同じタイプを知っている私のコードで

public class GenericClass<C> 
{ 
    private C value; 

    public C getValue() { return value; } 

    public void setValue(C value) { this.value = value; } 
} 

タイプGenericClassのメソッドsetValue(キャプチャ#11-of?)は、引数には適用されない です(キャプチャ#12)?

これを行うにはどうすればよいですか(ワイルドカードをキャストするようなもの...)?

答えて

3

は実際の囲まれた型の情報を保持していないので、コンパイラは2つのクラスが互換性があることを保証する方法がありません。具体的なジェネリック型パラメータを使用する必要があります。具体的なタイプがわからない場合、2つのタイプのパラメータの同一性を引き続き実行することができます。

public <T> void someMethod() { 
    GenericClass<T> obj1 = ... // has a value here 
    GenericClass<T> obj2 = ... // has a value here 

    obj1.setValue(obj2.getValue()); 
} 

これができない場合は、最後の手段として明示的なキャストを試してみるか、生の種類を使用することができます。これにより、コンパイルエラーがチェックされていないキャスト警告に交換されます。

+0

"これが不可能な場合"可能でない場合でも、上記のメソッドをプライベートヘルパーメソッドにして、どこからでも呼び出すことができます(コードを提供します)それを必要とし、それはキャプチャ変換のために動作します – newacct

1

あなたの方法を入力する必要があります。

public static <T extends GenericClass<?>> void someMethod() { 
    T obj1 = ... // has a value here 
    T obj2 = ... // has a value here 

    // Now they are the same type 

    obj1.setValue(obj2.getValue()); 
} 

はそれを試してみてください。

関連する問題