类文字语法是否必要?

时间:2011-03-01 02:28:10

标签: java syntax keyword

我很清楚,what is a class literal in java,我只是想知道,语法中.class的原因是什么。这有什么含糊之处吗?我的意思是,不会使用

替代Java语法
Class<String> c = String;

而不是

Class<String> c = String.class;

工作?对我而言,class关键字看起来像样板。

4 个答案:

答案 0 :(得分:3)

当然,你可以制作语法。但是使用.class后缀使编译器的工作更容易;它必须做更少的工作才能知道代码在语法上是正确的。

如果没有后缀,编译器必须更加努力地理解它之间的区别:

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

和此:

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

如果您认为不需要.class后缀,您是否还认为fL足够无效(适用于float和{{ 1}}文字,分别)?

答案 1 :(得分:1)

这不是一回事。 String是一个类型字符串类,String.member是其成员变量之一,String.method()将是其方法之一。

String.classClass类型的对象,用于定义String。您需要指定.class以表明您正在尝试引用Class类型的对象,这似乎更直观。

更不用说解析这种构造更容易了,并且可能防止你不小心返回Class对象的错误。

当您查看内部类时,这更为相关,例如OuterClass.InnerClass.class

使用Matt的例子:如何在不首先创建临时变量的情况下处理类对象?假设您的班级Foo有一个名为getClasses的静态方法,您如何区分Foo.getClassesFoo.class.getClasses

答案 2 :(得分:1)

String是String类伪对象,它提供对类静态字段和方法的访问,包括class,它引用描述String类的Class实例。所以它们是截然不同的,但由于Java没有(比如说)Smalltalk-80的元类排列,所以这不是很清楚。

如果您愿意,您当然可以将StringString.class设为同义词,但我认为这种区别有一个有效的基础。

答案 3 :(得分:0)

我们以整数为例:

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

在我看来,它似乎并没有流动。但那只是我的意见:))