2016-07-21 18 views
4

私は静的ファクトリメソッドとsetterメソッドを持つジェネリッククラスMyClass<T>持っている:setterメソッドでのJavaのジェネリック:互換性のない型

public class MyClass<T> { 
    public static <T> MyClass<T> with(Context context) { 
     MyClass<T> myClass = new MyClass<>(); 
     myClass.context = context; 
     return myClass; 
    } 
    public void setClass(Class<? extends CustomClass<T>> customClass) { 
     ... 
    } 
    ... 
} 

は、ユーザーが「CustomClass」から拡張するすべてのクラスを設定することができます。

これまでのところとても良いです。私がしている場合:

MyClass<String> myClass = MyClass.with(this); 
myClass.setClass(MyCustomClass.class); 

それは完全に動作します。しかし、もし私がすれば:

MyClass.with(this).setClass(MyCustomClass.class); 

コンパイルされません!コンパイラ出力:

Error:(44, 87) error: incompatible types: Class<MyCustomClass> cannot be converted to Class<? extends MyCustomClass<Object>> 

2番目のオプションでコンパイルできない理由はわかりません。

public class MyCustomClass extends CustomClass<String> 

答えて

5

は、あなたの作業例とコンパイルエラーを持っているあなたのワンライナーの間で不足している情報を得たことに注意してください:MyCustomClassは次のようです。

専門性はわかりません。あなたはそれはあなたがそれに「話を文字列」になります知っている

MyClass.<String>with(this).setClass(MyCustomClass.class); 

ような何かをする必要があります。

+0

感謝を!それは働いている! –

1

2番目のステートメントでは、タイプTを定義しないため、setClassの制限のためコンパイラはコンパイルできません。

あなたは、変数の目的のためにwith機能でTを追加する必要があります

public static <T> MyClass<T> with(Object context, Class<T> clazz) { 
    MyClass<T> myClass = new MyClass<>(); 
    myClass.context = context; 
    return myClass; 
    } 

MyClass.with(this, String.class).setClass(MyCustomClass.class); 

またはパス:あなたはそんなに

MyClass.<String>with(this).setClass(MyCustomClass.class); 
+0

ありがとう!このソリューションも機能します! –

関連する問題