2014-10-08 4 views
0

Скажем, у нас есть функция:Как получить тип класса вложенного родового типа?

void doSomething(Class<?> clazz); 

Если я хочу, чтобы назвать это для класса Foo, я бы назвал это так:

doSomething(Foo.class); 

Как вызвать DoSomething(), если мой тип есть Foo < Boo>?

Я думаю, вопрос в том, что является эквивалентом Foo.class для Foo < Boo>?

Возможно ли это?

- Обновление ---

Я объясню больше.

У меня есть набранное боб:

класс EventMessage <T> {

T полезной нагрузки;
Строковый тип;

}

Объект этого типа преобразуется в форму Json (String), а затем положить на очереди JMS; Потребитель должен отменить его обратно от String до его первоначальной формы. Json ObjectMapper должен знать тип для преобразования. Скажи мое EventMessage полезной нагрузки Тип предложения, то я хочу что-то вроде этого:

< EventMessage Предложение> offerEvent = jsonObjectMapper.readValue (jsonMsg, EventMessage < Предложение> .class)

Кроме того, что нет такой вещи, как EventMessage<Offer>.class.

Проблема заключается в том, что EventMessage является типизированным классом, поэтому преобразователь Json не имел понятия, как его разрешить без дополнительной информации о типе полезной нагрузки.

+6

Короткий ответ : вы не можете. Длительный ответ: временные решения зависят от того, что вы хотите сделать. –

ответ

-3

Попробуйте это:

doSomething((Class<Foo<Boo>>)Foo.class) 

Или это:

EventMessage<Offer> offerEvent = jsonObjectMapper.readValue(jsonMsg, 
          (Class<EventMessage<Offer>>) EventMessage.class); 

.class является язык буквальный, а не поле. Возможно, вам нравится сообщать о функции-запросе на java

+2

Что это вам поможет? Я думаю, аргументы типа в классе '' не будут доступны для 'doSomething'. – ajb

+1

Общий тип больше * generic *. Ведь ничего не получается. Может быть, вам не нужны @SuppressWarnings и checkstyle, не пронизывайте это как плохую практику. –

+1

Параметр метода имеет тип 'Class '. –

0

Существует только один объект класса Foo. Foo<Boo> и Foo<Integer> - не разные классы; они являются одним и тем же классом, и даже если вы можете сделать Foo<Boo>.class, он будет идентичен Foo, за исключением типа времени компиляции.Но в первом примере вы все равно не используете тип времени компиляции, так как вы переходите к параметру типа Class<?>.

В вашем втором примере вы не указали подпись readValue(), но я предполагаю, что это что-то вроде <T> T readValue(JSONMessage, Class<T>). Это полностью отличается от вашего первого примера. В этом случае тип времени компиляции помогает определить T, который является типом возврата. Вы можете либо манипулировать тип Class аргумента:

EventMessage<Offer> offerEvent = 
    jsonObjectMapper.readValue(jsonMsg, (Class<EventMessage<Offer>>) 
             (Class<?>)EventMessage.class) 

или просто использовать необработанный тип, получить сырье типа обратно, и пусть он будет неявно преобразован в параметризованного типа:

EventMessage<Offer> offerEvent = 
    jsonObjectMapper.readValue(jsonMsg, EventMessage.class) 
Смежные вопросы