2016-07-27 6 views
-3

Ich möchte eine Methode haben, die einen generischen Typ zurückgibt. Nehmen wir an, ich habe eine Elternklasse und 10 Kindklassen. Die Elternklasse hat keine Methode definiert und die Kindklassen haben unterschiedliche Funktionen (keine davon gemeinsam). Ich möchte ein Objekt der Kindklasse abhängig von einigen Eingaben erstellen. (Elternobjekt kann nicht erstellt werden, da ich die Methode der Klassen nicht aufrufen kann). Ich möchte also eine Funktion schreiben, die ein Objekt darin erzeugt und in der Hauptfunktion zurückgibt. Und ich möchte das T als Rückgabetyp abfangen. Wie rufe ich von main an.So rufen Sie eine Methode mit generischem Rückgabetyp in Java auf

public static <T> T fun() { 
    if (some condition) { 
     return new Class1(); 
    } else { 
     return new Class2(); 
    } 
} 

Wie rufe ich eine Funktion für korrekte Klasse auf?

Class xyz = fun(); 
+0

Ist es nicht offensichtlich, dass Sie das tun würden, indem Sie "irgendeine Bedingung" entweder wahr oder falsch machen? – Sufian

+1

Das ist kein gültiges Java, da der Methode ein Rückgabetyp fehlt. Es funktioniert auch nicht, weil weder 'Class1' noch' Class2' mit 'T' kompatibel sind, vorausgesetzt, Sie wollten den Typ' T' zurückgeben. Wenn der Rückgabetyp nicht "T" sein soll, was ist der Punkt von "T"? – Andreas

+1

Aus dem Blick auf den Code dort, meine Vermutung ist, dass Sie Generika nicht vollständig verstehen und was sie tun können. Was versuchst du wirklich? – Andreas

Antwort

0

Sie als Parameter

public <T> T getAsObject(Class<T> clazz) { 
    T bean = null; 
    try { 
     // do whatever you want to assign bean 
    } catch (Exception e) { 
     try { 
      bean = clazz.newInstance(); 
     } catch (Exception ex) { 
      // some log 
     } 
    } 
    return bean; 
}  

So können Sie es mit Klassen verwenden, die es von der Klasse erben, die als Parameter übergeben werden sollte verwendet wird

der Klassentyp, was Sie als Antwort verwenden möchten Zum Beispiel:

public abstract class Parent { 

    public Parent() { 
    } 

    public abstract void doit(); 
} 

public class Child1 extends Parent { 

    @Override 
    public void doit() { 
     // do something 
    } 
} 

public class Child2 extends Parent { 

    @Override 
    public void doit() { 
     // do other something 
    } 
} 

Jetzt können Sie es wie folgt verwenden:

Parent parent = getAsObject(Child1.class); 
// or 
Parent parent2 = getAsObject(Child2.class); 
Verwandte Themen