在Java中,匿名类可以声明自己的类型参数吗?

时间:2011-01-23 15:48:30

标签: java generics anonymous-class type-parameter

匿名类可以声明自己的类型参数吗?

4 个答案:

答案 0 :(得分:9)

你是对的,这是不可能的。由于匿名类只能使用一次,因此向它添加类型参数的重点是什么,你永远不能实际使用/继承它?您不能从定义它的任何其他代码位置实例化多次匿名类 ,并且您也不能将其子类化。

答案 1 :(得分:5)

没有。 Java语言规范详尽地定义了类实例创建表达式的可能参数,如下所示:

  

类实例创建表达式   指定要实例化的类,   可能后跟类型参数   (如果要实例化的类是   通用(§8.1.2)),后跟(a   可能是空的)实际值列表   构造函数的参数。它是   也可以传递显式类型   构造函数本身的参数   (如果它是一个通用的构造函数   (§8.8.4))。的类型参数   建设者马上跟着   关键字new。这是一个编译时   如果任何类型参数出错   用于类实例创建   表达式是通配符类型参数   (§4.5.1)。类实例创建   表达式有两种形式:

     
      
  • 不合格的类实例创建   表达式以关键字开头   新。一个不合格的类实例   创建表达式可用于   创建一个类的实例,   无论班级是否是一个   顶级(§7.6),成员(§8.5,§9.5),   本地(§14.3)或匿名类   (§15.9.5)。

  •   
  • 合格的类实例创建   表达式以Primary开头。一个   限定类实例创建   表达式可以创建   内部成员类和实例   他们的匿名子类。

  •   

因此,虽然您可以指定超类或接口或构造函数的实际类型参数,但您无法定义新的参数。虽然我认为这在某些极少数情况下可能有用(因为可以在类主体中使用新的类型参数),但有一个简单的解决方法:

  • 将类实例创建表达式包装在泛型方法中(匿名类将看到封闭方法的类型参数)
  • 使用命名类

答案 2 :(得分:2)

没有。

答案 3 :(得分:2)

但是,有一种方法可以使用参数。

匿名类中的任何声明方法都可以使用

  • 外部类最终的属性
  • 方法参数和最终方法
  • 变量

以下代码演示了

public class Foo
{

    private String value = "Hello ";

    public void anonymousTest(final boolean asc)
    {
        final String world = "world";

        new Comparable<String>()
        {
           @Override
           public int compareTo(String o)
           {
                System.out.println( value + world);
                int cmp = value.compareTo(o);
                return asc ?cmp :0-cmp;
            }
        }; 
    }
}

我希望这个例子会有所帮助。