2016-11-07 3 views
0

Überprüfen Sie meine benutzerdefinierte Klasse. Wenn ich DoSomething(), umGenerische Typen Java

final Custom<User> _custom = new Custom<>(new TypeToken<Custom<User>.Response<User>>(){}, ""); 

Dann wird das Debug-Protokoll zu ändern ist: "com.application.models.Custom$Response<com.application.models.User>" serverResponse: ""

Aber wenn DoSomething ist:

final Custom<T> _custom = new Custom<>(new TypeToken<Custom<T>.Response<T>>(){}, ""); 

Das Debug-Protokoll ist:

"com.application.models.Custom$Response<T>" serverResponse: " 

I habe eine Klasse wie diese:

// Ich habe das Debug-Protokoll auf der rechten Seite der Variablen

public class Custom<T> 
{ 
    private TypeToken<Response<T>> _responseType; _response: null 
    private Response<T> _response; _response: null 
    private String _serverResponse; _serverResponse = null; 

    public Custom(TypeToken<Response<T>> responseType, String serverResponse) `responseType: "com.application.models.Custom$Response<T>" serverResponse: "` 
    { 
     this._responseType = responseType; 
     this._serverResponse = serverResponse; 
    } 

    public class Response<t> 
    { 
     private List<t> data = null; 

     public List<t> GetData() 
     { 
      return this.data; 
     } 
    } 
} 

Dies ist, wo ich Haupt nennen ..

public class User 
{ 
    public int Id; 

    public void Test() 
    { 
     Main.<User>DoSomething(); 
    } 
} 
+0

Was meinst du mit * aus irgendeinem Grund, wenn ich das T noch generisch kompiliere, wenn ich Custom * erstelle? – Blackbelt

+2

Ich nehme 'Main main = new User <>();' ist ein Tippfehler und sollte 'Main main = new Main <>();', oder? – Eran

+0

Ja, ich habe meine Antwort aktualisiert –

Antwort

0

Java meist mit der Kompilierung Generika arbeiten, was bedeutet, dass Wenn du kompilierst, sind deine Generika weg. Sie sind nur eine Kompilierzeitprüfung. Beantwortet das deine Frage? Google Type Erasure

+0

Also kann ich 'final Custom _custom = new Custom <> (Modell) nicht verwenden; '? –

+0

Diese Syntax funktioniert nur, wenn T eine deklarierte Klasse ist. Die Abstraktion von Generika kann beim Definieren einer Klasse oder Methode verwendet werden. Wenn Sie eine Klasse instanziieren, geben Sie entweder einen Typ an oder verwenden Sie eine Inferenz, um den Typ abzuleiten. –

+0

Ja, aber wenn Sie meine Frage überprüfen, habe ich T in meiner Methode definiert ... –