2
Class clazz = new Object(){}.getClass();

为什么这是可能的,这意味着什么?有人可以提醒我吗?

例如:

public class Testing {
    public static void main(String[] args) {
        Class clazz = new Object(){}.getClass();
        System.out.println(clazz);
    }
}

结果是:class Testing$1

4

3 回答 3

9

new Object(){}创建一个匿名内部类,作为 的子类Object。它是 的内部类Testing,因此它会获得一个编译器生成的名称,就像您看到的那样。

于 2012-05-31T18:52:19.657 回答
4

它创建了一个匿名内部类子类化Object。我在 Guice 中看到的空主体的主要用途是 for TypeLiteral,它用于捕获泛型类型参数:

key = new TypeLiteral<List<String>>() {};

这很有用,因为类型擦除不适用于此处的超类,因此 Guice 能够List<String>取出无法表示为普通类文字的部分。

于 2012-05-31T18:53:08.067 回答
1

它与以下代码相同:

public class Testing{
      private class Anon extends Object{
      }
      public static void main(String[] args) {
          Class clazz = new Anon().getClass();
          System.out.println(clazz);
      }
}

是类的Testing$1名称,它是类Testing 中定义的第一个匿名类。

这些匿名类可用于在您使用它的地方实现接口,并且它们可以访问本地最终变量。

final String text = "Written by new Thread";
Thread thread = new Thread(new Runnable(){
     public void run(){
         System.out.println(text);
}});
thread.start();
于 2012-05-31T18:55:13.927 回答