2015-07-07 2 views
0

У меня есть этот код:как конвертировать дженерики в класс <T>?

public class JsonFileHandler<T> { 


    public T getContent(File file) { 
     T t = null; 
     ObjectMapper mapper = new ObjectMapper(); 

     if (!file.exists()) { 
      return null; 
     } else try { 
      t = mapper.readValue(file, T.class); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      throw new RuntimeException(e); 
     } 
     return t; 
    } 
} 

, но я получаю ошибку компиляции на этой линии:

t = mapper.readValue(file, T.class); 

который имеет эту подпись:

public <T> T readValue(File src, Class<T> valueType) 

, как я могу это исправить?

ответ

2

Я думаю, что единственный вариант, чтобы соответствовать подписи readValue:

public T getContent(File file, Class<T> clazz) { 
    // 
    t = mapper.readValue(file, clazz); 
    // 
} 

В качестве альтернативы, вы можете сделать это в вашем классе уровне конструктора:

public JsonFileHandler(Class<T> clazz) { this.clazz = clazz; } 
0

Вы не можете, типа параметр скомпилирован. Это называется стиранием типа.

+0

Фактически вы можете (хотя и не очень надежно) использовать TypeToken от Guava, см. Https://code.google.com/p/guava-libraries/wiki/ReflectionExplained#TypeToken – llogiq

0

Из-за стирания во время выполнения, T неизвестно во время выполнения. Самое простое решение передать маркер типа конструктору:

public class JsonFileHandler<T> { 

    private final Class<T> cls; 
    public JsonFileHandler(Class<T> cls) { 
     this.cls = cls; 
    } 

    public T getContent(File file) { 
     T t = null; 
     ObjectMapper mapper = new ObjectMapper(); 

     if (!file.exists()) { 
      return null; 
     } else try { 
      t = mapper.readValue(file, cls); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      throw new RuntimeException(e); 
     } 
     return t; 
    } 
} 
0

система ограничена дженерики Java не позволяет использовать «T.class». (Scala является более мощным в связи с этим)

Чтобы решить эту проблему, вы должны передать экземпляр класса методу getContent.

public T getContent(File file, tpe: Class<T>) { ... } 

Если вы используете Java 8 (если нет, то почему бы и нет?), А затем рассмотреть возможность возвращения Факультативный вместо того, чтобы избавиться от нулевой х и НЭП. Еще лучше было бы вернуть что-то, что указывает на успех или неудачу (например, на Scala's Try), поэтому вам не нужно использовать null или исключать исключение и правильно обрабатывать ошибку в нужном месте.

0

Что вы можете сделать, это приведение к классу:

 t = (T) mapper.readValue(file, Object.class); 

Это имеет тот же семантический, как то, что вы хотите сделать!

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