Наследование интерфейса в Java - PullRequest
0 голосов
/ 08 мая 2020

In:

// services
public interface Mother { public Collection<? extends Father> getMamaStuff() {}} 
public interface Daughter extends Mother {}

// data
public interface Father { public String getPapaStuff() }
public interface Son extends Father { public String playLoudMusic() }

почему это не разрешено:

public class Clazz {

    Clazz(Daughter daughter) {//boilerplate}

    public Collection<Son> idk = doughter.getMamaStuff();
}
  1. Это потому, что нет способа узнать, какую реализацию Father получит Clazz?
  2. Как лучше обойти это?
  3. Является ли пример хорошей практики в данном случае?

Мне кажется, что нет никакого способа обойти проверку типов.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Причина, по которой это не разрешено:

interface Feline { }
interface Kitten extends Feline {}
interface Tiger extends Feline {}

...

Cage<? extends Feline> makeCage();

// at this point, it's actually really important that 
// the right kind of cage was created...
makeCage().put(new Tiger());

Параметризация Mother может работать в вашей ситуации:

public interface Mother<T extends Father> { 
  public Collection<T> getMamaStuff(); {}
}
1 голос
/ 08 мая 2020

после исправления вашего сломанного предоставленного кода.

Все, что знает компилятор, это то, что мы получаем от матери, что это то, что расширяет отца. Он не знает, что это son конкретно.

Компилятор не выполняет приведение для ju.

Итак, в коллекции мы можем иметь something that extends father

// services
public interface Mother { public Collection<? extends Father> getMamaStuff(); {}}
public interface Daughter extends Mother {}

// data
public interface Father { public String getPapaStuff(); }
public interface Son extends Father { public String playLoudMusic(); }

public class Clazz {

    Clazz(Daughter daughter) {//boilerplate}

        Collection<? extends Father> idk = daughter.getMamaStuff();
    }
}
...