// 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>()
做同样的事情是不是有什么意义呢?我很困惑。
答案 0 :(得分:2)
否,您正在创建匿名类。您正在为抽象类创建子类,并提供实现并同时实例化它。
如果您尝试这样做:
return new AbstractList<Integer>();
您将收到错误,因为您不会提供具体的实现。
如果您感到困惑,可以随时查看官方教程。这里是: Java Inner Classes
答案 1 :(得分:1)
您正在创建一个继承抽象类的匿名类。 您需要将Abstract类的所有抽象方法实现到匿名类中。
答案 2 :(得分: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();
}
}
将生成:
答案 3 :(得分: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;
}
}