Я пытался понять, можно ли создать метод, который вводит общий тип на основе возвращаемого класса и вызывает статический метод этого универсального типа.Java - Общие статические методы
i.e Ниже я создаю 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;
}
}
Wrapper - показывает проблему
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 я получаю следующее сообщение об ошибке:
Ex ception in thread "main" java.lang.ClassCastException: ParentClass не может быть отброшен в SubclassA на Wrapper.main (Wrapper.java:20)
Могу ли я сделать это на Java?
не понимают, что вы здесь ожидаете .... вы вызываете статический метод в классе, он выполняется. почему он должен делегировать вызов подклассу? и как определить, какой из них? – Gab
Ну, надеюсь, он определил, какой подкласс должен делегировать, выводя из возвращаемого типа. Теперь я понимаю, что вы не можете переопределять статические методы, это имеет смысл. – user2294382