戻りクラスに基づいてジェネリック型を推論し、そのジェネリック型の静的メソッドを呼び出すメソッドを作成できるかどうかを理解しようとしています。
つまり、以下では、getInstances メソッドと getAllInstances メソッドを実装する 2 つのクラスを作成します。次に、ジェネリック ラッパーのメソッドを使用して作成を試みます。戻り値の型に関係なく、常にスーパー クラス メソッドが実行されているようです。
例えば、
public class ParentClass {
public ParentClass(){}
public static <T extends ParentClass> T getInstance(){
return (T) new ParentClass();
}
public static <T extends ParentClass> List<T> getAllInstances(){
ArrayList<ParentClass> parents = new ArrayList<ParentClass>();
for(int i=0;i<5;i++){
parents.add(new ParentClass());
}
return (List<T>) parents;
}
}
サブクラスA
public class SubclassA extends ParentClass{
public SubclassA(){}
@SuppressWarnings("unchecked")
public static SubclassA getInstance(){
return new SubclassA();
}
@SuppressWarnings("unchecked")
public static List<SubclassA> getAllInstances(){
ArrayList<SubclassA> parents = new ArrayList<SubclassA>();
for(int i=0;i<5;i++){
parents.add(new SubclassA());
}
return parents;
}
}
ラッパー - 問題を表示します
public class Wrapper {
public Wrapper(){
// ... some other stuff
}
public <T extends ParentClass> T getInstance(){
return T.getInstance();
}
public <T extends ParentClass> List<T> getAllInstances(){
return T.getAllInstances();
}
public static void main(String... args){
Wrapper wrapper = new Wrapper();
SubclassA subclassA = wrapper.getInstance();
ParentClass parentClass = wrapper.getInstance();
System.out.println(subclassA.getClass().getName());
System.out.println(parentClass.getClass().getName());
}
}
Wrapper を実行すると、次のエラーが表示されます。
スレッド「メイン」の例外 java.lang.ClassCastException: ParentClass は、Wrapper.main(Wrapper.java:20) で SubclassA にキャストできません
Javaでこれを行うことはできますか?