问题描述
不确定我是否了解。.有人告诉我不能实例化一个接口,但是当我使用LocationListener接口时,我会写:
{{1}}
这按预期工作,但这不是实例化接口吗?我不太确定我能明白...
解决方法
阐述安迪的评论:
如果您写类似
final int myLocal = ...;
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
doSomething(myLocal);
}
};
这是简写
class YourClassName$1 implements LocationListener {
private final YourClass enclosingInstance;
private final int myLocalCopy;
YourClassName$1(YourClass enclosingInstance,int myLocal) {
this.enclosingInstance = enclosingInstance;
this.myLocalCopy = myLocal;
}
@Override
public void onLocationChanged(Location location) {
doSomething(myLocalCopy);
}
}
然后
final int myLocal = ...;
locationListener = new YourClassName$1(this,myLocal);
(我使用的名称可能与您的编译生成的名称不匹配)
该速记方式会静默编译为一个新类(名称对于常规Java源代码而言是非法的)并实例化该类,然后通过构造函数参数将封闭的实例(以及方法中引用的任何局部变量)传递到新实例中。
所以,这是一个普通的旧类,需要实例化,而不是接口,只有该类不是您自己编写的,而是在编译这种语言构造时由编译器以静默方式编写的。