// 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>()上做的事情有什么不一样的呢?我很困惑。
发布于 2012-07-18 23:20:58
No,您正在创建一个匿名类。您正在创建抽象类的子类,同时提供一个实现并实例化它。
如果你尝试这样做:
return new AbstractList<Integer>();你会得到一个错误,因为你不会提供一个具体的实现。
如果你感到困惑,你可以随时查看官方教程。这就是:Java Inner Classes
发布于 2012-07-18 23:25:28
您正在创建一个继承抽象类的匿名类。您需要将abstract类的所有抽象方法实现到匿名类中。
发布于 2012-07-18 23:20:22
不,它不是实例化抽象类,因为代码提供了该类的实现。它就像一个匿名的内部类。
作为信息,所有类型的内部类在编译过程之后都会生成一个.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.java)
https://stackoverflow.com/questions/11544701
复制相似问题