每个类都是Class的实例

时间:2013-07-30 20:39:36

标签: java

以下代码无法编译,为什么?

System.out.println(Void.class instanceof Class);

这不会编译

//according to oracle doc, the type of Void.TYPE is Class<Void>
System.out.println(Void.TYPE instanceof Class);

错误消息是

VoidTest.java:6: inconvertible types found : java.lang.Class<java.lang.Void> required: Class System.out.println(Void.TYPE instanceof Class); 

我正在使用Darwin内核版本12.4.0和Java版本“1.6.0_51”

他们不会使用emacs + java + javac

进行编译

他们使用在线repl编译好:http://www.javarepl.com/console.html或在我的机器上使用eclipse

3 个答案:

答案 0 :(得分:4)

宣传回答评论......

我能够复制编译器错误,直到我发现我的目录中有一个Class.class文件(可能是因为尝试分析过去的StackOverflow问题)。

我删除了该文件,然后编译并运行得很好。

$ javac Main.java
Main.java:7: inconvertible types
found   : java.lang.Class<java.lang.Void>
required: Class
        System.out.println(Void.class instanceof Class);
                               ^
Main.java:8: inconvertible types
found   : java.lang.Class<java.lang.Void>
required: Class
        System.out.println(Void.TYPE instanceof Class);
                               ^
2 errors
$ rm Class.class
$ javac Main.java
$ java Main
true
true

某些自定义Class类优先于内置java.lang.Class

答案 1 :(得分:1)

这是一个评论,而不是答案,但我需要展示一些代码。这是我的测试程序:

public class Test {
  public static void main(String arg[])
  {
    System.out.println(Void.class instanceof Class);
    System.out.println(Void.TYPE instanceof Class);
    Class c1 = (Class)Void.class;
    Class c2 = (Class)Void.TYPE;
    System.out.println(c1.getName());
    System.out.println(c2.getName());
  }
}

我在Eclipse下编译并运行它,其合规级别为1.7,合规级别为1.3。两种方式,它编译和打印:

true
true
java.lang.Void
void

添加强制转换的原因是编译器拒绝比较实例的一个合理原因是相应的强制转换是编译时错误。我确实收到关于演员的警告,但没有错误。

答案 2 :(得分:0)

Void.class是Class的实例(通知大写)。

object是一个类的实例。

他们两个编译得很好