2013-04-18 5 views
8

Я пытался понять, можно ли создать метод, который вводит общий тип на основе возвращаемого класса и вызывает статический метод этого универсального типа.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?

+0

не понимают, что вы здесь ожидаете .... вы вызываете статический метод в классе, он выполняется. почему он должен делегировать вызов подклассу? и как определить, какой из них? – Gab

+0

Ну, надеюсь, он определил, какой подкласс должен делегировать, выводя из возвращаемого типа. Теперь я понимаю, что вы не можете переопределять статические методы, это имеет смысл. – user2294382

ответ

1

Ваш подход неверен, в Java нет понятия статического Inheritance, поскольку наследование всегда находится в контексте уровня Object. Только методы-члены (нестатические) могут быть унаследованы под-классами, имеющими соответствующие модификаторы доступа.

Обновление: В дополнение к добавлению в вашем сценарии Factory pattern кажется более подходящим, чем настройка дженериков для получения/построения определенных объектов класса.

2

статические методы не будут override.This static методы будут принадлежит Class уровня

1

Нет, вы не можете сделать это следующим образом. Для того, чтобы сделать его работу вы можете передать объект класса:

public class ParentClassUtils 

    public static <T extends ParentClass> T getInstance(Class<T> clazz) { 
     return clazz.newInstance(); 
    } 

    public static <T extends ParentClass> List<T> getAllInstances(Class<T> clazz) { 
     List<T> list = new ArrayList<T>(); 
     for (int i = 0; i < 5; i++) { 
      list.add(getInstance(clazz)); 
     } 
     return list; 
    } 
} 

Кроме того, в вашем примере вы имеете эквивалентные статические методы родительских классов и подклассов. Методы подкласса не переопределяют методы родительского класса, они просто скрывают их, и это почти наверняка не то, что вы хотите. Этот подход класса полезности выше обходит это.