11

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

4

3 回答 3

9

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

于 2011-01-23T15:59:08.763 回答
5

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

类实例创建表达式指定要实例化的类,可能后跟类型参数(如果要实例化的类是泛型的(第 8.1.2 节)),然后是构造函数的实际值参数列表(可能为空)。也可以将显式类型参数传递给构造函数本身(如果它是泛型构造函数(第 8.8.4 节))。构造函数的类型参数紧跟在关键字 new 之后。如果类实例创建表达式中使用的任何类型参数是通配符类型参数(第 4.5.1 节),则会出现编译时错误。类实例创建表达式有两种形式:

  • 不合格的类实例创建表达式以关键字 new 开头。非限定类实例创建表达式可用于创建类的实例,无论该类是顶级(第 7.6 节)、成员(第 8.5 节、第 9.5 节)、本地(第 14.3 节)还是匿名类( §15.9.5)。

  • 合格的类实例创建表达式以 Primary 开头。合格的类实例创建表达式允许创建内部成员类及其匿名子类的实例。

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

  • 将类实例创建表达式包装在泛型方法中(匿名类将看到封闭方法的类型参数)
  • 使用命名类
于 2011-01-23T16:20:51.127 回答
2

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

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

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

下面的代码演示了它

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

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

于 2011-01-23T17:30:42.623 回答