2016-11-07 7 views
0

Проверьте мой пользовательский класс. Если я изменю DoSomething() дляОбщие типы java

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

Тогда лог DEBUG является: "com.application.models.Custom$Response<com.application.models.User>" serverResponse: ""

Но если DoSomething является:

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

Журнал DEBUG является:

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

I есть класс:

public class Main 
{ 
    public static <T> void DoSomething() 
    { 
     final Custom<T> _custom = new Custom<>(new TypeToken<Custom<T>.Response<T>>(){}, ""); 
    } 
} 

// Я добавил журнал отладки справа от переменных

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; 
     } 
    } 
} 

Это где я называю Main ..

public class User 
{ 
    public int Id; 

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

Что вы подразумеваете под * по какой-то причине, когда я скомпилирую T еще общий, когда я создаю Custom *? – Blackbelt

+2

Я предполагаю 'Главная main = new Пользователь <>();' является опечаткой и должен быть 'Main main = new Main <>();', right ?. – Eran

+0

Да, я обновил свой ответ –

ответ

0

Java в основном работают с компиляции дженериков времени, а это означает, что когда вы компилируете, ваши дженерики исчезли. Это всего лишь проверка времени компиляции. Отвечает ли это на ваш вопрос? Google Type Erasure.

+0

Так что я не могу использовать 'final Custom _custom = new Custom <> (model); '? –

+0

Этот синтаксис не будет работать, если T не является объявленным классом. Абстракция дженериков может использоваться при определении класса или метода. При создании экземпляра класса вы будете либо указывать тип, либо использовать тип вывода для вывода типа. –

+0

Да, но если вы проверите мой вопрос, я определил T в моем методе ... –

Смежные вопросы