Краткий ответ: вы не можете.
Длинный ответ: Тип Erasure: http://download.oracle.com/javase/tutorial/java/generics/erasure.html
Рассмотрим параметризованный экземпляр ArrayList<Integer>
.Во время компиляции компилятор проверяет, что вы не помещаете в экземпляр списка массивов ничего, кроме совместимых с Integer
.
Однако, также во время компиляции (и после синтаксической проверки) компилятор удаляет типпараметр, переводящий ArrayList<Integer>
в Arraylist<?>
, что эквивалентно ArrayList<Object>
или просто ArrayList
(как в pre JDK 5 раз.)
Более поздняя форма - это то, что ожидает JNI (из-за исторических причин кака также из-за того, как дженерики реализованы в Java ... опять же, тип erasure.)
Помните, ArrayList<Integer>
is-a ArrayList
.Таким образом, вы можете передать ArrayList<Integer>
в JNI везде, где он ожидает ArrayList
.Обратное не обязательно верно, так как вы можете получить что-то из JNI, которое не совместимо вверх с вашими хорошо параметризованными обобщениями.
В этот момент вы пересекаете барьер между типизированным параметризованным доменом (вашими обобщениями)и нетипизированный (JNI).Вы должны довольно красиво инкапсулировать этот барьер, и вы должны добавить клейкий код и код проверки ошибок / обработки ошибок, чтобы определить, когда / если что-то не очень хорошо конвертируется.