2017-01-12 5 views
0

Zunächst weiß ich, dass Sie Typ als Parameter übergeben können, indem Sie Class<T> verwenden. Allerdings habe ich ein Szenario wie folgt:Prozessparameter als Typen

nehme ich an, ein Verfahren für die Erstellung von MyOwnType haben (der Code kompiliert unten):

public MyOwnType<? extends Type,? extends Type> createMyOwnType(String name, Class<? extends Type> T1, Class<? extends Type> T2)

Was ich wirklich tun wollen ist Typ Variablen T1 verwenden und T2 MyOwnType zu konstruieren:

MyOwnType<T1,T2> 

ich weiß, dass Sie direkt MyOwnType ohne createMyOwnType Verfahren konstruieren können. Aber ich möchte ein richtiges Factory-Muster verwenden, um MyOwnType für Benutzer zu erstellen + ein paar Einschränkungen, die ich aufschlüsseln werde.

Ich möchte nicht alle Parameter eins nach dem anderen überprüfen, sagen, wenn T1 ein Typ ist, und T2 ist ein Typ, dann Construct MyOwnType. Weil ich in einigen Fällen viele Ts haben könnte, sind sie alle Subtypen von Type. Daher werde ich T1xT2xT3xT_n Kombinationen zu überprüfen haben.

Daher meine Frage ist, dass ist es eine Möglichkeit, MyOwnType zu schaffen auf der Grundlage der Parameter zur Verfügung gestellt (T1 und T2), etwas Ähnliches wie den folgenden Code:

MyOwnType<T1,T2> myowntype=new MyOwnType<T1,T2>(name); 

Der obige Code wird nicht durch kompilieren zu dem Java-Compiler kann Symbol T1, T2 nicht finden.

+0

Die einzige Möglichkeit dies zu tun ist, wenn Sie den gleichen Konstruktor für jeden Subtyp des Typs –

+1

bieten. Starker Vorschlag: Erwägen Sie die Verwendung von Reflexion: [Was ist Reflexion und warum ist es nützlich?] (Http://stackoverflow.com/ Fragen/37628/Was-ist-Reflexion-und-warum-ist-es-nützlich) – paulsm4

+2

Ich bin mir nicht sicher, was Sie erwarten, dass Ihr Code zu tun. Denken Sie daran, dass die Methode zur Laufzeit wegen [type erasure] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html) nur 'public ist MyOwnType createMyOwnType (String name, Klasse T1, Class T2) ', dh der Rückgabetyp ist nur eine MyOwnType-Klasse/Schnittstelle, die nicht von" T1 "und" T2 "abhängt. – Andreas

Antwort

1

Sie können Java Generics in diesem Fall verwenden. Siehe Beispiel für Ihren Fall:

class Type {} 

// create some classes based on Type 
class Car extends Type {} 
class Bike extends Type {} 
class Boat extends Type {} 

@Data 
class MyOwnType<T1 extends Type, T2 extends Type > { 
    private String name; 
    private T1 field1; 
    private T2 field2; 
} 

public class SomeClass { 

    public static <T1 extends Type, T2 extends Type> MyOwnType<T1, T2> createMyOwnType(String name) { 
     MyOwnType<T1, T2> result = new MyOwnType<>(); 
     result.setName(name); 
     return result; 
    } 

    public static void main(String[] args) { 
     MyOwnType<Car, Boat> sample1 = createMyOwnType("orange"); 
     Car car = sample1.getField1(); 
     Boat boat = sample1.getField2(); 

     MyOwnType<Boat, Bike> sample2 = createMyOwnType("red"); 

    } 
} 

hier anstelle von Parametern in Fabrik-Methode übergeben wir nur in Deklaration von Variablen gewünschten Typen angeben „sample1“ und „sample2“. Ich hoffe es ist was du willst.

Aber wenn Sie echte Fabrik erstellen möchten, d. H. Typen innerhalb der Methode verwenden, dann ist dies nicht möglich, da Java dies nicht unterstützt. Sie können nur Klassen wie in meinem Beispiel vorbereiten. Inside-Methode wissen Sie nur, dass T1 und T2 Typ erweitert.

+0

Ist dies etwas, um T1 und T2 für die tatsächliche Methode zu deklarieren? Vielen Dank. Das ist was ich will. Ich weiß nie, dass Sie Generika auf diese Weise verwenden können. Vielen Dank. – user1197891

Verwandte Themen