2013-04-18 23 views
8

Ho cercato di capire se è possibile creare un metodo che inferisca un tipo generico basato sulla classe return e che invochi un metodo statico di quel tipo generico.Java - Metodi statici generici

Ad esempio, qui sotto creo 2 classi che implementano entrambi i metodi getInstances e getAllInstances. Quindi tento di creare i metodi da un wrapper generico. Sembra che il metodo di super classe venga sempre eseguito indipendentemente dal tipo di ritorno.

Per esempio,

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 - mostra il problema

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()); 
    } 

} 

Quando si esegue Wrapper ricevo il seguente errore:

Ex ception in thread "main" java.lang.ClassCastException: ParentClass non può essere trasmesso a SubclassA su Wrapper.main (Wrapper.java:20)

Posso farlo in Java?

+0

non capisco cosa ti aspetti qui .... stai chiamando un metodo statico su una classe, è eseguito. perché dovrebbe delegare la chiamata a una sottoclasse? e come determinare quale? – Gab

+0

Beh, la speranza era che avrebbe determinato la sottoclasse a cui delegare inferendo dal tipo di ritorno. Ora capisco che non è possibile sovrascrivere i metodi statici che ha senso. – user2294382

risposta

1

L'approccio non è corretto, non vi è alcuna nozione di statico Inheritance in Java poiché l'ereditarietà è sempre nel contesto del livello dell'oggetto. Solo i metodi membro (non statici) possono essere ereditati da sottoclassi con appropriati modificatori di accesso.

Aggiornamento: Inoltre, nel proprio scenario, lo schema di fabbrica sembra più adatto rispetto alla regolazione dei generici per ottenere/costruire oggetti di classe specifici.

2

metodi statici non saranno override.This static metodi volontà appartiene a Class livello

1

No, non si può fare in questo modo. Per farlo funzionare è possibile passare l'oggetto Class:

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; 
    } 
} 

Inoltre, nel tuo esempio hai metodi statici equivalenti in classi e sottoclassi genitore. I metodi di sottoclasse non sovrascrivono i metodi della classe genitore, li nascondono semplicemente, e questo quasi certamente non è ciò che vuoi. Questo approccio di classe di utilità sopra aggira questo.