2012-09-17 3 views
1

У меня есть класс с общим типом, и я хочу получить класс универсального типа. Я нашел решение со следующим кодом, но когда я использую ProGuard для обфускации, мое приложение перестает работать.Как определить класс родового типа в java

Есть ли другой способ сделать это?

public class comImplement<T> { 

    private T _impl = null; 

    public comImplement() {} 

    public T getImplement() { 

    if (_impl == null) { 
     ParameterizedType superClass = 
     (ParameterizedType) getClass().getGenericSuperclass(); 
     Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0]; 
     try { 
     _impl = type.newInstance(); 
     } catch (Exception e) { 
     } 
    } 
    return _impl; 
    } 
} 

ответ

2

Вы не можете получить тип суперкласса, если это не параметризованных с другим общим классом, например - список или что-то в этом роде. Из-за параметров типа reification после компиляции будут потеряны параметры. Вы можете решить проблему с прохождением экземпляр класса, который вы собираетесь создавать, метод «getImplement, как показано ниже:

public T getImplement(Class<T> clz) { 
    // do your initialization there 
} 

другая проблема, которая может поднять с кодом - это состояние гонки в случае, если объект разделяется между несколькими потоками.

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