3

下面的代码不会编译,为什么?

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); 

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

他们不会使用 emacs + java + javac 编译

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

4

3 回答 3

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.

于 2013-07-30T21:23:52.310 回答
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

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

于 2013-07-30T20:56:26.743 回答
0

Void.class 是 Class 的一个实例(注意大写)。

Anobject是类的实例。

他们都编译得很好

于 2013-07-30T20:43:18.787 回答