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 类的所有抽象方法都实现到匿名类中。

于 2012-07-18T15:25:27.650 回答
0

不,它不是实例化抽象类,因为代码提供了该类的实现。它就像一个匿名的内部类。

就像信息一样,所有类型的内部类在编译过程之后都会生成一个 .class 文件。所以,代码:

测试.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 回答