2016-02-16 9 views
0

Я знаю, что в Java есть различные возможности с отражением. Например:Как динамически класть класс в <>

Class<?> clazz = Class.forName("java.util.Date"); 
Object ins = clazz.newInstance(); 

Интересно, если бы я мог передать класс dynamicaly в какой-то метод декларации в <> тегов (или есть другой способ сделать это, если это должно быть исправлено). Я хотел бы изменить динамическое объявление класса; потому что я хотел бы написать общий метод для всех типов классов.

Там, у меня есть это:

List<Country> 

Могу ли я написать ему что-то diffrent с отражением? Например, может быть каким-то образом достигнуто, чтобы передать класс в качестве параметра (или как это должно быть сделано):

List<ins> 

? Я был бы признателен за примеры.

+0

Этот тип (в смысле ограничений по типу проверки) отбрасывается во время компиляции и становится 'java.lang.Object' или' SomeType', если ' '. Google «стирание типа Java». –

+0

Я бы сказал, что это параметры типа, а не отражение. Но независимо от того, сможете ли вы добиться того, что вы хотите с помощью генериков, зависит от контекста, который вы хотите использовать в этом списке, и о том, как вы планируете устанавливать этот тип. –

ответ

0

Я не думаю, что это возможно. Дженерики в Java реализованы таким образом, что запрещает доступ во время выполнения.

1

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

При работе с отражением, вы основно работаете с сырыми типами, и нужно закодировать в соответствии с тем, что означает, что вы можете бросить возвращаемый результат newInstance() к списку введите вашу потребность, например:

List<Country> ins = (List<Country>)clazz.newInstance(); 

Это безопасная операция, потому что вы знаете, что в этой точке ее пусто, и она не передается во внешний код.

+0

Хорошо. Как написать такие методы? Передать ins переменной в param метода, поэтому определение класса списка определено раньше? – DarioBB

+0

На это нельзя ответить, не видя большего изображения – Ferrybig

0

Существуют генераторы, позволяющие компилятору проверять правильность ввода текста, но больше не присутствуют во время выполнения (это называется стиранием типа). Отражение относится только к представлению типов времени выполнения. Насколько я знаю, единственный случай, когда размышление приходится иметь дело с дженериками, - это выяснить «фиксированные» параметры типа подклассов, например. когда у вас есть class Bar<T> и class Foo extends Bar<String>, вы можете узнать, что T из Bar зафиксирован на String в Foo используя отражение. Однако это также информация, содержащаяся в файле класса. Кроме того, отражение может видеть только или создавать типы raw.

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

  • Нет связанных вопросов^_^