2015-01-26 3 views
1
Test test1 = new Test(); 

здесь, новый тест() означает создать новый экземпляр класса Test и присвоить ему ссылаться test1.класса Java Generic Синтаксис выражений

Class<Test> test2 = Test.class; 
Test test2Instance = test2.newInstance(); 

Я не могу определить (в словах) 1-ое заявление. С другой стороны, 2-я формулировка довольно мне понятна.

РЕДАКТИРОВАТЬ

Строка является экземпляром класса класса.

Строковый литерал (например, «Я строка») является экземпляром класса Строка.

литерал класса (например Hashtable.class) является экземпляром класса класса.

ответ

2
Class<Test> test2 = Test.class; 

Этот оператор объявляет переменную с именем test2, типа Class<Test>. Он инициализирует эту переменную уникальным экземпляром этого типа, используя выражение литерала класса Test.class, которое относится к классу Test.

+0

. @ JB Nizet, вы включили «выражение класса буквально» в своем ответе, дайте мне ключ, и я просмотрел его в Google http: // stackoverflow.com/questions/2160788/what-is-a-class-literal-in-java, и я получил его, что я ищу. –

+1

'Test.class' - действительно литерал класса. Точно так же, как '1' является целым литералом, а' 'hello" 'является строковым литералом. –

+0

спасибо @JB Nizet –

1
Class<Test> test2 = Test.class; 

означает «дать мне Class объект, представляющий Test класс и хранить его в переменной test2.

Помимо Class быть общим, это имеет мало общего с генериков. Это об объектах класса .

0

Class<Test> - это особый тип общего типа. Буквально вы определяете переменную test2, которая имеет тип Class<T> с T == Test.

Class<T> - это параметрический тип, он зависит от T, если вы добавите ограничение T == Test, тогда вы говорите о переменной Class<Test> (которая относится к определенному разному типу).

Это ортогонально по сравнению с полиморфизмом по подтипу. Если у вас есть

class Base { .. } 
class Derived extends Base { .. } 

и писать

Derived derived = ... 

У вас нет проблем в том, что вы объявляете переменную с именем derived типа Derived. Это то же самое, но Class<Test> не является подтипом Class<T>, но является его специализацией.

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