2016-10-02 5 views
0

Ich habe die folgende Klasse:Wie instanziiert man eine Unterklasse, ohne sie vorher zu kennen?

public class Abuser { 
    <T extends Spam> List<T> createSpam() { 
     List<T> lst = new ArrayList<>(); 
     T s = new T(); 
     s.prepareAd(); 
     lst.add(s); 
     // the above is done unknown number of times 
     return lst; 
    } 
} 

mit Klassen wie folgt zu verwenden:

public class Spam { 
    void prepareAd() {} 
} 
public class WildSpam extends Spam {} 
public class MildSpam extends Spam {} 

auf folgende Weise:

Abuser a = new Abuser(); 
Lost<WildSpam> wSpam = a.createSpam(); 
List<MildSpam> mSpam = a.createSpam(); 

Wie diese Arbeit mit minimalem Aufwand machen ?

+1

Nun, Sie wissen es im Voraus. Erstellen Sie also zwei Methoden statt nur einer: createWildSpam() und createMildSpam(). –

+1

Die Nützlichkeit des Polymorphismus in Java (oder einer beliebigen OOP-Sprache) ist genau das, dass Sie ein 'Spam'-Objekt verwenden möchten, ohne zu wissen, was seine spezielle Implementierung ist. Können Sie erklären, was Sie hier versuchen? –

+0

Mögliches Duplikat von [* Erzeuge Instanz generischen Typs in Java? *] (Http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java) –

Antwort

-1

Java sollte wissen, welche Objekte erstellt werden müssen. Sie müssen einen Parameter an Ihre Methode übergeben, um sie zu informieren.

So:

public class Abuser { 
<T extends Spam> T createSpam(T a) { 
    T s = null; 
    try { 
     Class cls = Class.forName(a.getClass().getName()); 
     s = (T) cls.newInstance(); 
     s.prepareAd(); 
     // the above is done unknown number of times 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return s; 
} 
} 

es wie folgt verwendet:

Abuser a = new Abuser(); 
    WildSpam wSpam=new WildSpam(); 
    wSpam=a.createSpam(wSpam); 
    MildSpam mSpam = new MildSpam(); 
    mSpam=a.createSpam(mSpam); 

Dieser Code ist für ein Objekt nicht eine Liste von Objekten.

+0

danke. Wie in der verwandten Ausgabe (aus den Kommentaren) scheint dies der einzige gangbare Weg mit dieser verkrüppelten Sprache – vkamenen

+0

Das kann nur NullPointerExceptions erzeugen. –

+0

@JB, hahaha .... Trotzdem .... – vkamenen

Verwandte Themen