匿名クラスは独自の型パラメーターを宣言できますか?
3 に答える
そうです、それは不可能です。匿名クラスは一度だけ使用することを意図しているため、実際に使用/継承できない型パラメーターを追加するポイントは何ですか? 匿名クラスを、それを定義する場所以外のコードの場所から複数回インスタンス化することはできません。また、それをサブクラス化することもできません。
いいえ。Java言語仕様では、クラスインスタンス作成式に対する可能な引数を次のように徹底的に定義しています。
クラスインスタンス作成式は、インスタンス化されるクラスを指定し、場合によっては型引数(インスタンス化されるクラスが汎用(§8.1.2)の場合)の後に、コンストラクターへの実際の値引数の(場合によっては空の)リストが続きます。明示的な型引数をコンストラクター自体に渡すこともできます(ジェネリックコンストラクター(§8.8.4)の場合)。コンストラクターへの型引数は、キーワードnewの直後に続きます。クラスインスタンス作成式で使用される型引数のいずれかがワイルドカード型引数(§4.5.1)である場合、コンパイル時エラーになります。クラスインスタンス作成式には、次の2つの形式があります。
修飾されていないクラスインスタンス作成式は、キーワードnewで始まります。クラスがトップレベル(§7.6)、メンバー(§8.5、§9.5)、ローカル(§14.3)、または匿名クラス(§14.3)であるかどうかに関係なく、非修飾クラスインスタンス作成式を使用してクラスのインスタンスを作成できます。 §15.9.5)。
修飾されたクラスインスタンス作成式は、プライマリで始まります。修飾されたクラスインスタンス作成式を使用すると、内部メンバークラスとその匿名サブクラスのインスタンスを作成できます。
したがって、スーパークラスやインターフェイス、またはコンストラクターの実際の型パラメーターを指定することはできますが、新しいパラメーターを定義することはできません。これはまれなケースで役立つ可能性があることを認めますが(新しいタイプパラメーターはクラス本体から使用できるため)、そのための簡単な回避策があります。
- クラスインスタンス作成式をジェネリックメソッドでラップします(匿名クラスは、囲んでいるメソッドの型パラメーターを参照します)
- 名前付きクラスを使用する
しかし、パラメータを使用する方法があります。
匿名クラス内で宣言されたメソッドは、
- 外部クラス 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;
}
};
}
}
例が役立つことを願っています。