Почему интерфейс в случае 1 выдает ошибку времени компиляции, но в случае 2 компилируется успешно - PullRequest
0 голосов
/ 25 октября 2018

У меня два интерфейса в "CASE 1", в которых у меня один и тот же метод с разными типами возвращаемых данных, и я расширяю оба интерфейса в другом интерфейсе, тогда я получаю ошибку времени компиляции, поскольку возвращаемые типы несовместимы для унаследованных методов, но здеськогда мы расширяем два интерфейса в третьем интерфейсе, тогда методы перегружаются, а при перегрузке метода возвращаемый тип метода не оказывает влияния, тогда почему это дает ошибку.

Также, если я использую одни и те же методы в двух интерфейсах с одинаковым возвратомвводит "CASE 2" и расширяет оба интерфейса в третьем интерфейсе, тогда здесь я не получаю никаких ошибок.Почему?

CASE 1

Interface1.java

public interface I1
{
int m();
}

Interface2.java

public interface I2
{
void m();
}

Interface3.java

public interface I3 extends I1,I2
{

}

CASE 2

Interface1.java

public interface I1
{
int m();
}

Interface2.java

public interface I2
{
int m();
}

Interface3.java

public interface I3 extends I1,I2
{

}

1 Ответ

0 голосов
/ 25 октября 2018

В первом случае интерфейс не совместим.Для любого класса было бы невозможно реализовать его, так как он не может удовлетворить ограничения "должен быть int m() метод" и "должен быть void m() метод".

Вы говорите: «при перегрузке метода возвращаемый тип метода не имеет никакого эффекта» - это не совсем так.При перегрузке метода возвращаемый тип не является частью подписи.Вы не можете перегружать методы, изменяя только тип возвращаемого значения, в точности , поскольку имеют одинаковую сигнатуру:

class Foo
{
    public void m() {}
    public int m() { return 1; }
}

Результат:

error: method m() is already defined in class Foo

В секундуслучай, интерфейс является последовательным.Это вполне возможно реализовать, просто с помощью одного метода int m() { ... }.Тот факт, что один метод будет использоваться для реализации I1.m и I2.m, не является проблемой.

...