Могу ли я получить класс из аргумента generic type? - программирование
Подтвердить что ты не робот

Могу ли я получить класс из аргумента generic type?

У меня есть следующий класс:

public abstract class MyClass<T extends Object> {

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,T.class); // T.class isn't allowed :(
    }
}

Как передать экземпляр класса < T? Есть ли какая-то странная и дурацкая работа?

Есть ли способ получить ссылку класса <T> , отличную от предварительно созданного объекта типа T? Это также не позволит мне сделать это:

T t = new T();
Class<T> klass = t.class;

Попытка # 2

Интересно, что если я удалю "расширяет JSONOBjBase" из определения класса, я просто получаю непроверенный листинг ПРЕДУПРЕЖДЕНИЕ (без ошибок). Есть ли другой способ написать, как выполняется бросок?

eclipse screenshot

4b9b3361

Ответ 1

Или вы можете отправить Class в качестве аргумента конструктора и использовать этот объект вместо того, чтобы пытаться получить T.class.

public abstract class MyClass<T extends Object> {

    private Class<T> klass;

    public MyClass(Class<T> klass) {
        this.klass = klass;
    }

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,klass); 
    }
}

Ответ 2

Нет.
Из-за стирания типа эта информация не существует во время выполнения.

Вместо этого вы можете повторно использовать GSON TypeToken hack, который создает анонимный класс, наследующий закрытый базовый класс.

Ответ 3

OK. Так вы должны это сделать:

      public abstract class MyClass <T> {

        public T createNewFormData(Reader reader, Class<T> clazz){
        return GSON.fromJSON(reader, clazz);
        }
      }

      public class ImplementMyClass extends MyClass<Long>{
      }

И назовите его следующим образом:

            MyClass<Long> cls = new ImplementMyClass();


    Socket s = null;
    try {
        s = new  Socket("localhost", 8080);
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }
    InputStream i = null;
    try {
        i = s.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
    InputStreamReader reader = new InputStreamReader(i);
    cls.createNewFormData(reader, Long.class);

Ответ 4

Этот вид повторяет ответ, данный Алексом выше. Здесь пример кода, где я пишу общую json- > POJO-оболочку, используя библиотеку jackson:

/* Method that reads json string from a file, and maps it to an instance of the class passed in as the second argument. */


public static <T> T getObjectMappedFromJsonInFile(String fileName, Class<T> clazz){

    ObjectMapper mapper=new ObjectMapper();

    File file=new File(fileName);

    try{

        JsonNode jsonNode=mapper.readTree(file);

        T response=mapper.convertValue(jsonNode,clazz);

        return response;
    }catch (Exception e){

        log.error("Error reading transactions.json file",e);

    }
    return null;

}

И вот как я это называю:

TransactionsResponse response=getObjectMappedFromJsonInFile(fileName,TransactionsResponse.class);