在下面发布的代码中,HTEsotericPoliticsOfTheWest是一个内部类,当我尝试定义接口时,由于接口不是固定的,eclipse会产生错误!您能否解释一下为什么必须在内部类的上下文中声明接口为ststic?
**代码:
//This is an inner-class
private class HTEsotericPoliticsOfTheWest extends HandlerThread {
private final String TAG = HTEsotericPoliticsOfTheWest.class.getSimpleName();
private Handler _mHandler = null;
//#constructor(s)
public HTEsotericPoliticsOfTheWest(String name) {
super(name);
}
public HTEsotericPoliticsOfTheWest(String name, int priority) {
super(name, priority);
}
public void enqueueTaskForNorthGroup(String token) {
Message msg = Message.obtain();
msg.obj = token;
}
//********ISSUE IS HERE***********
interface Isynchronizer {
void filteredNews();
}
public void enqueueTaskForEastGroup(String token) {
}
//#handlers-instances
public Handler getInitedHandlerInstanceForNorthGroup() {
return new Handler(getLooper(), new HandlerCallbackNorthGroup());
}
public Handler getInitedHandlerInstanceForEastGroup() {
return new Handler(getLooper(), new HandlerCallbackEastGroup());
}
//#run
@Override
public void run() {
super.run();
Log.w(TAG, "run");
}
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
Log.w(TAG, "onLooperPrepared");
}
//#termination-methods
@Override
public boolean quit() {
return super.quit();
}
@Override
public boolean quitSafely() {
return super.quitSafely();
}
//#handlers-callbacks classes
private class HandlerCallbackNorthGroup implements Handler.Callback {
@Override
public boolean handleMessage(Message msg) {
String token = (String) msg.obj;
int s;
switch (token) {
case NORTH_GROUP_PRESEDENTIAL_1:
s = 3;
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("", s + " elapsed");
break;
case NORTH_GROUP_EDUCATIONAL_PRIVATE_1:
s = 7;
try {
TimeUnit.SECONDS.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("", s + " elapsed");
break;
case NORTH_GROUP_GEOGRAPHICAL_1:
s = 10;
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("", s + " elapsed");
break;
case NORTH_GROUP_MARINE_1:
s = 13;
try {
TimeUnit.SECONDS.sleep(13);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("", s + " elapsed");
break;
}
return false;
}
}
//Q:is it achievable/feasible to pass/communicate between two Handlers?one is in the mainAct while the other is in an inner class?
private class HandlerCallbackEastGroup implements Handler.Callback {
@Override
public boolean handleMessage(Message msg) {
return false;
}
}
}
由于接口不是静态的,eclipse产生了错误!
当接口以另一种类型嵌套时,它是static
成员。但是,问题在于内部类不能声明静态成员。这是导致错误的组合。
在内部类上,Java Language Specification甚至是关于接口的特定说明:
8.1.3。内部类和封闭实例
内部类可能未声明静态初始化程序(§8.7)或成员接口,否则会发生编译时错误。
内部类不得声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。
您可能有兴趣阅读JLS 14的版本,该版本经过改写以指定嵌套接口作为该类的成员是隐式静态的;并且不允许内部类声明静态(显式或隐式地)成员。