我很清楚,what is a class literal in java,我只是想知道,语法中.class
的原因是什么。这有什么含糊之处吗?我的意思是,不会使用
Class<String> c = String;
而不是
Class<String> c = String.class;
工作?对我而言,class
关键字看起来像样板。
答案 0 :(得分:3)
当然,你可以制作语法。但是使用.class
后缀使编译器的工作更容易;它必须做更少的工作才能知道代码在语法上是正确的。
如果没有后缀,编译器必须更加努力地理解它之间的区别:
String.getName() // a method inherited from java.lang.Class<T>
和此:
String.valueOf(...) // a static method from java.lang.String
如果您认为不需要.class
后缀,您是否还认为f
和L
足够无效(适用于float
和{{ 1}}文字,分别)?
答案 1 :(得分:1)
这不是一回事。 String
是一个类型字符串类,String.member
是其成员变量之一,String.method()
将是其方法之一。
String.class
是Class
类型的对象,用于定义String
。您需要指定.class
以表明您正在尝试引用Class
类型的对象,这似乎更直观。
更不用说解析这种构造更容易了,并且可能防止你不小心返回Class
对象的错误。
当您查看内部类时,这更为相关,例如OuterClass.InnerClass.class
。
使用Matt的例子:如何在不首先创建临时变量的情况下处理类对象?假设您的班级Foo
有一个名为getClasses
的静态方法,您如何区分Foo.getClasses
和Foo.class.getClasses
?
答案 2 :(得分:1)
String
是String类伪对象,它提供对类静态字段和方法的访问,包括class
,它引用描述String类的Class
实例。所以它们是截然不同的,但由于Java没有(比如说)Smalltalk-80的元类排列,所以这不是很清楚。
如果您愿意,您当然可以将String
和String.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
在我看来,它似乎并没有流动。但那只是我的意见:))