JavaRush /Java блог /Архив info.javarush /Замыкания и обратные вызовы. Нужен совет.
Konkistador
28 уровень

Замыкания и обратные вызовы. Нужен совет.

Статья из группы Архив info.javarush
В главе "Внутренние классы" книги Б.Эккеля к теме "Замыкания и обратные вызовы" представлен следующий пример кода: //innerclasses/Callbacks.java // Использование внутренних классов // для реализации обратных вызовов package innerclasses; interface Incrementable { void increment(); } // ПРОСТО реализуем интерфейс: class Callee1 implements Incrementable { private int i = 0; public void increment() { i++; System.out.println(i); } } class MyIncrement { public void increment() { System.out.println("Другая операция"); } public static void f(MyIncrement mi) { mi.increment(); } } // Если ваш класс должен вызывать метод increment() // по-другому, необходимо использовать внутренний класс class Callee2 extends MyIncrement { private int i = 0; private void increment1() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { public void increment() { // Указывается метод внешнего класса, иначе // возникает бесконечная рекурсия: Callee2.this.increment1(); } } Incrementable getCallbackReference() { return new Closure(); } } class Caller { private Incrementable callBackReference; Caller(Incrementable cbh) { callBackReference = cbh; } void go() { callBackReference.increment(); } } public class Callbacks { public static void main(String[] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); } } Компилятор сообщает что не может переопределить метод increment() в классе Callee2. Попытка присвоить более низкие привилегии доступа. И это понятно, в Java во время наследования возможно изменения модификаторов доступа только в сторону большей видимости. Подскажите, что хотел донести автор? Где тут опечатка?
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Антон Уровень 36
20 апреля 2020
Надеюсь кому-то поможет мой ответ, чтобы не убить на поиск ответа 3 часа, как я. Это ошибка переводчиков. В английской версии код выгляди так: (не знаю как правильно вставлять картинки)