Я пытаюсь понять, как методы по умолчанию справляются с проблемой алмаза в различных сценариях.
И это один из сценариев, который я не могу понять.
Ниже приведено описание
1. Интерфейс с методом по умолчанию method ()
2. Абстрактный класс с методом method ()
3. Конкретный класс, реализующий описанный выше интерфейс и расширяющий абстрактный класс.
interface Interface {
default void method() {
System.out.println("Interface method");
}
}
abstract class AbstractClass {
void method() {
System.out.println("Abstract class method");
}
}
// Concrete class definition first starts
public class ConcreteClass extends AbstractClass implements Interface {
@Override
public void method() {
super.method();
}
public static void main(String[] args) {
Interface test = new ConcreteClass();
test.method();
}
}
// Concrete class definition first ends
// Concrete class definition Second starts
public class ConcreteClass extends AbstractClass implements Interface {
public static void main(String[] args) {
Interface test = new ConcreteClass();
test.method();
}
}
// Concrete class definition Second ends
Мои запросы,
1. Почему определение сначала всегда дает вывод как «Метод абстрактного класса» , даже когда я использую тип Interface для конкретного объекта класса?
2. Почему определение second не компилируется?
Если компилятор сначала использует реализацию абстрактного класса в определении, то он должен быть в состоянии определить, что он всегда будет использовать реализацию абстрактного класса во втором определении.
Это поведение меня очень смущает, и любая помощьс благодарностьюВ противном случае, чем больше я углубляюсь в это, тем больше это сбивает с толку.
Редактировать 1:
Ошибка компиляции во втором определении "Унаследованный метод AbstractClass.method () не можетскрыть публичный абстрактный метод в интерфейсе "