2011-01-23 5 views
10

匿名クラスは、独自の型パラメータを宣言できますか?Javaでは、匿名クラスが独自の型パラメータを宣言できますか?

+1

質問を明確にするために(疑似)コードを表示できますか? –

+0

30秒以内にこれをテストするコードを書いて、あなた自身の質問に答えることができます。 –

+0

私はそれが可能だとは思わないので、それのための構文はありません。しかし、何かのように: 'MyInterface m = new MyInterface() {/ * body * /};' –

答えて

9

あなたはそうではありません。匿名クラスは一度しか使用されないので、実際に使用/継承することはできない型パラメータを追加する点は何でしょうか?匿名クラス は、 を定義するコード以外の場所からインスタンス化することはできません。また、サブクラス化することもできません。次のように

+0

これは私が思ったものです。ありがとう。 –

+1

実際には、クラスインスタンス作成式を再度実行することによって、匿名クラスを任意に何回もインスタンス化することができます。 – meriton

+1

匿名クラスの本体で型パラメータを使いたいかもしれません... – meriton

5

いいえJava言語仕様を網羅クラスインスタンス生成式に可能な引数を定義:

をクラスインスタンス生成式 が おそらく型引数、続いてインスタンス化されるクラスを指定 (インスタンス化されているクラスが ジェネリック(§8.1.2))、コンストラクタへの実際の値 の引数のあとに(おそらく空の )リストが続きます。 明示的な型 引数をコンストラクタ自体に渡すことも可能です (汎用コンストラクタの場合は (8.4.4)))。 コンストラクタへの型引数は、すぐに キーワードnewに続きます。型インスタンス引数 のいずれかがクラスインスタンス作成 式で使用されている場合は、ワイルドカード型引数 (§4.5.1)がコンパイル時に エラーです。クラスインスタンス生成 式は二つの形式があります。

  • 修飾されていないクラスインスタンス生成 式を新しいキーワード で始まります。クラスのインスタンスを トップレベル(§7.6)、メンバー(§8.5、§9.5)、 ローカル(§14.3)であるかどうかにかかわらず、 作成式を使用して、 クラスのインスタンスを作成することができます。 )または匿名クラス (§15.9.5)。

  • 修飾クラスインスタンスの作成 式は、プライマリで始まります。 修飾クラスインスタンスの作成 式を使用すると、内部メンバークラスの インスタンスとその匿名サブクラス インスタンスの作成が可能になります。

あなたは、スーパークラスやインターフェイス、またはコンストラクタの実際の型パラメータを指定することができながら、だから、あなたは新しいものを定義することはできません。新しいタイプのパラメータをクラス本体から使用できるため、これはいくつかのまれなケースで役に立ちますが、簡単な回避策があります:

  • クラスインスタンス作成式を汎用メソッドでラップします(匿名クラスは、囲むメソッドの型パラメータが表示されます)
  • パラメータを使用する方法がある、という名前のクラス
+0

良い回避策。 +1 –

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

      この例が役立つことを願っています。

    関連する問題