匿名类可以声明自己的类型参数吗?
3 回答
你是对的,这是不可能的。由于匿名类只能使用一次,因此向它添加您永远无法实际使用/继承的类型参数有什么意义?除了定义它的代码位置之外,您不能从任何其他代码位置多次实例化匿名类,也不能将其子类化。
不,Java 语言规范详尽地定义了类实例创建表达式的可能参数,如下所示:
类实例创建表达式指定要实例化的类,可能后跟类型参数(如果要实例化的类是泛型的(第 8.1.2 节)),然后是构造函数的实际值参数列表(可能为空)。也可以将显式类型参数传递给构造函数本身(如果它是泛型构造函数(第 8.8.4 节))。构造函数的类型参数紧跟在关键字 new 之后。如果类实例创建表达式中使用的任何类型参数是通配符类型参数(第 4.5.1 节),则会出现编译时错误。类实例创建表达式有两种形式:
不合格的类实例创建表达式以关键字 new 开头。非限定类实例创建表达式可用于创建类的实例,无论该类是顶级(第 7.6 节)、成员(第 8.5 节、第 9.5 节)、本地(第 14.3 节)还是匿名类( §15.9.5)。
合格的类实例创建表达式以 Primary 开头。合格的类实例创建表达式允许创建内部成员类及其匿名子类的实例。
因此,虽然您可以指定超类或接口或构造函数的实际类型参数,但您不能定义新的参数。虽然我承认这在极少数情况下可能有用(因为可以从类主体中使用新的类型参数),但有一些简单的解决方法:
- 将类实例创建表达式包装在泛型方法中(匿名类将看到封闭方法的类型参数)
- 使用命名类
但是,有一种使用参数的方法。
匿名类中的任何声明方法都可以使用
- 外部类 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;
}
};
}
}
我希望这个例子会有所帮助。