Создан специфический метод анонимного класса, но обратиться к нему нельзя

Рейтинг: 0Ответов: 1Опубликовано: 17.07.2023

Разбираюсь со статьей https://javarush.com/groups/posts/2193-anonimnihe-klassih и не могу получить аналогичный результат в IDEA. Я создала интерфейс и анонимный класс со специфическим методом, но IDEA не принимает такой код как в статье и требует указать сигнатуру метода в интерфейсе. Почему?

public interface MonitoringSystem {

public void startMonitoring();

}

public class TipesOfClasses {

public static void main(String[] args) {


MonitoringSystem generalModule = new MonitoringSystem() {
    @Override
    public void startMonitoring() {
        System.out.println("Общий мониторинг");
    }
    public void someSpecificMethod() {
        System.out.println("Специфический метод");
    }
};
MonitoringSystem errorModule = new MonitoringSystem() {
    @Override
    public void startMonitoring() {
        System.out.println("Мониторинг ошибок");
    }
};
       
    generalModule.startMonitoring();
//Здесь IDEA подчеркивает красным метод someSpecificMethod()
    generalModule.someSpecificMethod();
        
    }
     
    }

Ответы

▲ 1Принят

Такой трюк до 11 версии вряд ли возможен без создание нового типа. По сути вы ограничиваете доступные методы типом MonitoringSystem который знать не знает про метод someSpecificMethod(). Естественно получаете ошибку компиляции.

Начиная с 11 версии появилось ключевое слово var, с помощью которого тип объекта выводится "на лету":

 var generalModule = new MonitoringSystem() {
            @Override
            public void startMonitoring() {
                System.out.println("Общий мониторинг");
            }
            public void someSpecificMethod() {
                System.out.println("Специфический метод");
            }
        };
 generalModule.someSpecificMethod(); // no error

Переменная generalModule получает динамически сформированный тип (анонимный тип), который всё знает о методах анонимного класса (в том числе и новых) и позволяет ими пользоваться.

А что по поводу ссылки, которую вы указали - я не нашёл там места, где новый метод используется вне анонимного класса. Да, добавлять можно, но пользоваться только внутри.