2013-07-30 4 views
4

У меня длинная история.Кастинг родовых типов без предупреждения?

java generics bounds type

generics type declaration for reflection

Во всяком случае, у меня есть метод, который вызывает метод с помощью отражения и возвращает общий результат.

public static <V> JAXBElement<V> unmarshal(..., Class<V> valueType); 

Проблема (?) Возникает, когда я получил результат вызова метода. Я должен бросить его.

final Object result = method.invoke(...); 

я обнаружил, что могу бросить result в JAXBElement<V>, как это.

@SuppressWarnings("unchecked") 
final JAXBElement<V> result = (JAXBElement<V>) method.invoke(...); 
return result; 

Есть ли другой способ для этого? Я имею в виду, что я использовал Class<V> valueType.

Если нет, следует следующее заявление немного cumbersome?

// no warning, huh? :) 
final JAXBElement<?> result = (JAXBElement<?>) method.invoke(...); 
return new JAXBElement<V>(result.getName(), valueType, result.getScope(), 
          valueType.cast(result.getValue())); 

Спасибо.

ответ

2

Нет, method.invoke(...) не является общим методом даже целых Method класс не является общим. Поэтому он возвращает Object в результате, и вам нужно бросить.

// no warning, huh? :) 
final JAXBElement<?> result = ... 

Да нет предупреждений, но JAXBElement<?> ставит некоторые ограничения, например, вы не можете поместить значения в эту структуру данных. Вы можете просто получить Objects оттуда, так что вам, вероятно, понадобится использовать его позже в вашем коде ...

1

Вы должны объявить общий тип V в методе, как это:

public <V> JAXBElement<V> unmarshal(..., Class<V> valueType) 

Кроме того, я не могу найти какие-либо ошибки в коде.

+0

Woops! Обновлено. Благодарю. –

1

В общем, короткий ответ - нет.

Однако, если вы думаете об этом, чего бы вы хотели достичь? Вы сказали, что хотите вызвать фрагмент кода через отражение. Дженерики используются, чтобы доказать, что ваш код верен во время компиляции (поэтому во время компиляции erased и вообще не доступно во время выполнения).

Если вы вызываете метод отражением, вы можете буквально называть его любыми типами и получать любой тип результата. Было бы очень сложно доказать правильность во время компиляции.

Возможно, вы можете изменить ваш код, чтобы он не использовал отражение, и, таким образом, избегать кастинга.

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