2015-10-01 3 views
0

Есть в любом случае, чтобы сделать что-то вроде этого:Можно ли использовать переменную как общий тип в java?

Type type = new TypeToken<MyHappyClass>(){}.getType(); 
List<type> = new LinkedList<type>(); 

спасибо заранее

========================= =============================================

Я попытаюсь объяснить, что мне нужно, надеюсь, что я не делаю ничего смешного

Я использую restTemplate.getForObject для получения данных из веб-службы. Однако они используют пользовательский MediaType, поэтому я реализую CustomMessageConverter, чтобы restTemplate понял этот MediaType и преобразовал его в мой объект данных.

Проблема заключается в том, что этот объект данных использует дженерики. Все объекты, возвращенные из этого веб-сервиса, имеют некоторые общие поля и некоторые специфические, поэтому, чтобы сопоставить это, а не повторить код, я создал общий элемент, и каждый ресурс простирается от элемента.

Итак, мой MessageConverter создается таким образом:

public class MyMessageConverter<T extends Item> extends AbstractHttpMessageConverter<T> 

И мой readInternal выглядит следующим образом:

@Override 
protected T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage) 
    throws IOException, HttpMessageNotReadableException { 

    InputStream istream = inputMessage.getBody(); 
    String responseString = IOUtils.toString(istream); 

    Type type = new TypeToken<GeneralItem<?>>(){}.getType(); 
    GeneralItem<?> resource = new Gson().fromJson(responseString, type); 

    return (T) resource.getItem(); 
} 

Но это не работает, потому что мне нужен тип clazz вместо шаблона (*) для gson для его анализа. Я иду не так?

+3

№ Пожалуйста, объясните, что вы на самом деле пытаетесь сделать. –

+0

Нет, Java generics - это функция времени компиляции, поэтому к моменту запуска кода и переменным есть значения, слишком поздно, чтобы заполнить параметры типа. – neuronaut

+0

В связанном сообщении используйте 'GeneralItem' вместо' List'/'ArrayList'. –

ответ

0

В java вы не можете иметь «общий» тип. Хотя при программировании вы можете настроить свою программу, чтобы она могла использовать иерархию, которую ваш основной родительский класс может быть вашим общим «родовым» типом. Оттуда вы можете иметь дочерние классы, которые будут переопределять родительский объект, «общий» и, следовательно, основы ориентированного на объект программирования.

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