私は、リターンクラスに基づいてジェネリック型を推論し、そのジェネリック型の静的メソッドを呼び出すメソッドを作ることができるかどうかを理解しようとしています。Java - 汎用静的メソッド
つまり、私は2つのクラスを作成し、どちらもgetInstancesメソッドとgetAllInstancesメソッドを実装しています。次に、ジェネリックラッパーからメソッドを作成しようとします。スーパークラスメソッドは戻り値の型に関係なく常に実行されているようです。例えば
、
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;
}
}
SubclassA
は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());
}
}
表示:
例をスレッド "main"でception java.lang.ClassCastException:ParentClassをSubclassAにキャストすることができません Wrapper.main(Wrapper.java:20)
Javaでこれを実行できますか?
あなたがここで期待していることを理解できません....あなたはクラスで静的メソッドを呼び出しています。実行されます。呼び出しをサブクラスに委譲する理由は何ですか?どのように決定するか? – Gab
戻り値の型から推論することにより、どのサブクラスに委譲するかを決定することができたのではないでしょうか。 ここでは、わかりやすい静的メソッドをオーバーライドできないことを理解しています。 – user2294382