Был ли необходим буквальный синтаксис класса? - PullRequest
0 голосов
/ 01 марта 2011

Я хорошо знаю, что такое литерал класса в java , мне просто интересно, в чем причина .class в синтаксисе. Есть ли двусмысленность, устраненная этим? Я имею в виду, не будет ли альтернативный синтаксис Java с использованием

Class<String> c = String;

вместо

Class<String> c = String.class;

работа? Для меня ключевое слово class выглядит как шаблон.

Ответы [ 4 ]

3 голосов
/ 01 марта 2011

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

Без суффикса компилятору пришлось бы работать усерднее, чтобы понять разницу между этим:

String.getName() // a method inherited from java.lang.Class<T>

и этим:

String.valueOf(...) // a static method from java.lang.String

Если вы не думаете, что нужен суффикс .class, считаете ли вы, что суффиксы f и L бесполезны (для float иlong литералы соответственно)?

1 голос
/ 01 марта 2011

String - это псевдообъект класса String, который обеспечивает доступ к статическим полям и методам классов, включая class, который ссылается на экземпляр Class, который описывает класс String.Так что они различны, но поскольку в Java нет метакласса (скажем, Smalltalk-80), это не очень понятно.

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

1 голос
/ 01 марта 2011

Это просто не то же самое.String является классом типа string, а String.member является одной из его переменных-членов, String.method() будет одним из его методов.

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

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

Это еще более актуально, когда вы смотрите на внутренние классы, такие как OuterClass.InnerClass.class.

Для работы с примером Мэтта: Как бы вы работали с объектом класса без необходимости сначала создавать временную переменную?Предполагая, что в вашем классе Foo есть статический метод с именем getClasses, как бы вы различали Foo.getClasses и Foo.class.getClasses?

0 голосов
/ 01 марта 2011

Давайте используем целое число в качестве примера:

Class<Integer> c = Integer; // your proposal
int i = Integer.MAX_VALUE; // compare with below
int j = c.MAX_VALUE; // hmm, not a big fan, personally

По-моему, оно просто не течет. Но это только мое мнение :)

...