2015-08-25 2 views
0

В JLS 15.8.2, это говоритКак понять литературу класса Java?

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

И в WIKI, он говорит

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

И я не видел ни одного оператора, подобного ему, в here

Я знаю, что String.class является примером Class<String>, I просто не понимаю, почему на земле мы можем написать такое выражение.

И что же такое .class действительно и как понимать это обозначение?

+0

Для всех практических целей 'String.class' не является _an_ экземпляром' Class 'это экземпляр _the_. Если вы не делаете что-то очень сложное, все строки в вашей программе должны принадлежать одному классу (то есть к тому же самому классу «»). –

+0

Существует много аннотаций (которые нуждаются в статической информации), которым нужна информация о классе, и вы можете дать ее так (пример TestNG): '@Test (expectedException = BlubException.class)'. И есть другие причины использовать 'XYZClass.class'. Вы можете получить хороший ответ с большим количеством примеров. – Tom

+1

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

ответ

2

String.classявляется первичным выражение, которое не разлагается операндов и операторов, но это не мешает он имеет внутреннюю синтаксическую структуру. Уверен, вы согласитесь, что " также не является оператором. "i am a string" - это буквальное выражение.

0

Если на объекте foo есть общественное поле под названием bar, вы можете обратиться в это поле только с foo.bar. Здесь то же самое - подумайте об этом как о неявном публичном статическом поле под названием class.

0

. фактически является оператором: это «оператор точек». Он не упоминается в официальном списке операторов, потому что .. кто знает.

Это, однако, упоминается в the official tutorial:

Код, который находится вне класса объекта необходимо использовать ссылку на объект или выражение, за которым следует точка оператора, а затем простым именем поля,

(.)
+0

Для чего-то качественного для оператора его нужно использовать только в том контексте, где его левая и правая стороны - _operands_, а операнд должен быть выражением. Таким образом, неофициально мы называем это оператором, но формально это действительно не одно. –

+0

@MarkoTopolnik Я не совсем уверен, что левая и правая стороны не являются операндами. Не первый ли доступ к классу, а второй - к полю? Я не знаком с терминологией Java синтаксического дерева, но в C# Roslyn, это выражения SimpleMemberAccessExpression. –

+0

Но я не могу найти имя поля 'class'. –

0

Синтаксис Foo.class является ярлыком для (new Foo()).getClass() без выделения памяти. Это полезно в любое время, когда метод хочет получить экземпляр Class<?> в качестве аргумента.

Некоторые примеры в стандартной библиотеке:

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