какие модификаторы доступа должны быть установлены для интерфейса-члена, принадлежащего внутреннему классу, и почему - PullRequest
1 голос
/ 08 апреля 2020

В приведенном ниже коде HTEsotericPoliticsOfTheWest является внутренним классом, когда я попытался определить интерфейс, затмение сгенерировало ошибку, поскольку интерфейс не ststi c! Не могли бы вы объяснить, почему интерфейс должен быть объявлен ststi c в контексте внутреннего класса ??

** код:

//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;
        }
    }
}

1 Ответ

0 голосов
/ 08 апреля 2020

eclipse сгенерировал ошибку, так как интерфейс не устарел c!

Когда интерфейс вложен в другой тип, он является static членом. Проблема, однако, в том, что внутренний класс не может объявлять stati c членов. Именно эта комбинация приводит к ошибке.

На внутренних классах Java Спецификация языка даже указывает c об интерфейсах:

8.1.3. Внутренние классы и вложенные экземпляры

Внутренние классы могут не объявлять инициализаторы stati c (§8.7) или интерфейсы-члены , или возникает ошибка времени компиляции.

Внутренние классы могут не объявлять элементы stati c, если только они не являются константными переменными (§4.12.4) или не возникает ошибка времени компиляции.

Возможно, вам будет интересно прочитать версию JLS 14 , в которой указано, что вложенный интерфейс неявно указывается c как член класса; и что внутреннему классу не разрешается объявлять stati c (явно или неявно) членов.

...