2016-08-04 5 views
1

zuweisen Wenn ich eine Klasse mit einem generischen wie diesem:Wie assign Typ in einer generischen Klasse mit einem param java.lang.reflect.Type

public class ResponseSimple<T> { 

    private Map<String, Collection<String>> headers; 
    private int status; 
    private T body; 
} 

Dann in anderer Klasse habe ich eine Methode, die Ich muss eine Instanz dieser Klasse verwenden, aber die Methode übergibt Parameter java.lang.reflect.Type und es ist übergangen, so dass ich die Methode (Name, Unterschrift ..) nicht ändern kann:

public class ResponseEncoder extends GsonDecoder { 

    public ResponseEncoder() { 
     super(); 
    } 
    @Override 
    public Object decode(Response response, Type type) throws IOException 
    { 
     //How assign type T using type param?? 
     //¿ResponseSimple<T> responseSimple = new ResponseSimple();? 

     return null; 
    } 

} 

Wie konnte ich den generischen Typ T mit dem Param-Typ (java.lang.reflect.Type) zuweisen?

+0

Sie haben zwei separate 'response' Variablen unterschiedlicher Typen. – newacct

Antwort

3

Ich würde so etwas wie dies vorschlägt:

@Override 
public <T> T decode(Response response, Class<T> type) throws IOException 
{ 
    //How assign type T using type param?? 
    ResponseSimple<T> response = new ResponseSimple<T>(); 

    return response; 
} 

Dann dekodieren wie folgt verwenden:

.decode(response, NameOfClass.class) 

Edit:

Wenn Sie Ihre Klasse erweitern möchten, können Sie eine statische Hilfsfunktion verwenden:

public static <T> ResponseSimple<T> createResponse(Class<T> clazz) 
{ 
     return new ResponseSimple<>(); 
} 

Und es wie folgt verwenden:

public class ResponseEncoder extends GsonDecoder { 

    public ResponseEncoder() { 
     super(); 
    } 
    @Override 
    public Object decode(Response response, Type type) throws IOException 
    { 
     Class<?> clazz = (Class<?>) type; 
     ResponseSimple<?> response = createResonse(clazz); 

     return null; 
    } 

} 
+0

Ich erweitere eine Klasse, daher ist diese Methode übergangen und ich kann sie nicht ändern :(Es muss java.lang.reflect.Type sein – Pau

+0

siehe bearbeitete Antwort – Richard

+0

Es tut mir leid, aber es funktioniert nicht :(Fehler: Die Methode createResponse (Klasse ) im Typ ResponseSimple gilt nicht für die Argumente (Type) – Pau

0

Ich hoffe, ich habe Ihre Frage richtig verstanden. Um eine neue Instanz der generischen Klasse erstellen müssen Sie die richtige Art Argumente wie diese schließen, wenn Sie Ihre wollen ResponseSimple<T> enthalten java.lang.reflect.Type:

ResponseSimple<Type> response = new ResponseSimple<>(); 

Also, dazwischen die <> Sie den Namen der Klasse hinzufügen müssen Sie möchten verwenden.

haben auch einen Blick auf diese: https://docs.oracle.com/javase/tutorial/java/generics/types.html

// EDIT: Wie Sie gesagt haben Sie die Typargumente dynamisch ableiten wollen, was Sie funktioniert gut für mich getan hat. Die einzige Sache ist, dass Sie die Diamanten Betreiber vergessen:

@Override 
public Object decode(Response response, T type) throws IOException 
{ 
    ResponseSimple<T> response = new ResponseSimple<>(); //<> in the second part 

    return null; 
} 
+0

Ich wollte den Typ verwenden, den es von param mit dem Param-Typ nicht der Klasse Type übergeben hat, danke! – Pau

+0

Dann ersetzen Sie '' durch '' –

+0

Aber ich kann nicht den Typ ClassName nach Typ param und ich muss es dynamisch setzen – Pau