Вы не можете реализовать абстрактный метод в interface
, и SubInt
все еще является interface
, а не class
, поскольку
interface SubInt extends SuperInt
пытается расширить интерфейс и не реализует it.Для его реализации вы должны использовать
public class SuperIntImpl implements SuperInt {
@Override
public void method3() {
}
}
С другой стороны, method2
- это метод default
, поэтому он компилируется с реализацией.
пример SubInt
и SuperInt
с переопределенной реализацией по умолчанию в SubInt
, надеюсь, этот пример прояснит ситуацию:
public interface SuperInt {
void method3();
void method4();
}
public interface SubInt extends SuperInt {
@Override
default void method3() {
System.out.println("Inside SubInt");
}
}
, тогда как реализация SubInt
теперь может выбрать переопределение или нетmethod3
, необходимо по-прежнему реализовывать method4
как
public class SubIntImpl implements SubInt {
@Override
public void method4() {
}
// can reuse the implementation of the 'method3'
}
, и для любой реализации SuperInt
все равно необходимо иметь собственную реализациюmethod3
и method4
public class SuperIntImpl implements SuperInt {
@Override
public void method3() {
// must have my own implementation
}
@Override
public void method4() {
// must have my own implementation
}
}