0
// Concrete implementation built atop skeletal implementation
  static List<Integer> intArrayAsList(final int[] a) {
    if (a == null)
      throw new NullPointerException();
    return new AbstractList<Integer>() {
      public Integer get(int i) {
        return a[i]; // Autoboxing 
      }

      @Override
      public Integer set(int i, Integer val) {
        int oldVal = a[i];
        a[i] = val; // Auto-unboxing
        return oldVal; // Autoboxing
      }

      public int size() {
        return a.length;
      }
    };
  }

これまでのところ、抽象クラスをインスタンス化することはまったくできないことを私は知っていました。しかし、ここで同じことをしているのではないreturn new AbstractList<Integer>()でしょうか。私は混乱しています 。

4

4 に答える 4

2

いいえ匿名クラスを作成しています。抽象クラスをサブクラス化し、実装を提供すると同時にそれをインスタンス化します。

これを試してみると:

return new AbstractList<Integer>();

具体的な実装を提供しないため、エラーが発生します。

混乱している場合は、いつでも公式チュートリアルを確認できます。ここにあります: Java内部クラス

于 2012-07-18T15:20:58.137 に答える
1

抽象クラスを継承する匿名クラスを作成しています。Abstractクラスのすべての抽象メソッドをanonymousクラスに実装する必要があります。

于 2012-07-18T15:25:27.650 に答える
0

いいえ、コードはそのクラスの実装を提供するため、抽象クラスをインスタンス化していません。それは匿名の内部クラスのようなものです。

情報と同様に、すべてのタイプの内部クラスは、コンパイルプロセス後に.classファイルを生成します。したがって、コード:

Test.java

public class Test {

    abstract class Foo {
        abstract void foo();
    }

    public Foo bar() {
        return new Foo() {
            @Override
            void foo() {
                System.out.println( "foo!!!" );
            }
        };
    }

    public static void main( String[] args ) {
        new Test().bar().foo();
    }

}

生成されます:

  • Test.class:ファイルのパブリッククラス(Test.java)
  • Test $ Foo.class:Testクラス内の抽象内部クラス。
  • Test $ 1.class:barメソッド内にコーディングされた匿名の内部クラス。
于 2012-07-18T15:20:21.850 に答える
0

いいえ匿名クラスを作成しています。

あなたのコード:

return new AbstractList<Integer>() {
    public Integer get(int i) {
        return a[i]; // Autoboxing 
    }

    @Override
    public Integer set(int i, Integer val) {
        int oldVal = a[i];
        a[i] = val; // Auto-unboxing
        return oldVal; // Autoboxing
    }

    public int size() {
        return a.length;
    }
};

と同等です:

...

return new myNewClass()

...


public class myNewClass extends AbstractList<Integer>{
    public Integer get(int i) {
        return a[i]; // Autoboxing 
    }

    @Override
    public Integer set(int i, Integer val) {
        int oldVal = a[i];
        a[i] = val; // Auto-unboxing
        return oldVal; // Autoboxing
    }

    public int size() {
        return a.length;
    }
}
于 2012-07-18T15:40:13.090 に答える