Java: несовместимый тип возвращаемого значения с классом, реализующим интерфейс - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть интерфейс и реализация:

// there are things
public interface Thing { /* ... */ }
// balls are things
public class Ball implements Thing { /* ... */ }

У меня есть другой интерфейс и другая реализация:

// a dog can fetch any thing
public interface Dog {
    public Thing fetch();
}
// a shepherd can fetch only a ball
public class Shepherd implement Dog {
    public Ball fetch() { /* ... */ }
}

Это нормально.

Но теперь я хочу использовать Ball в качестве параметра параметризованного класса:

public interface Dog {
    public List<Thing> fetchList();
}
public class Shepherd implement Dog {
    public List<Ball> fetchList() { /* ... */ }
}

Java не позволяет мне это делать, говорит, что я пытаюсь использоватьнесовместимый тип.

В то же время эта конструкция работает без каких-либо проблем:

public class Shepherd implement Dog {
    public List<Thing> fetchList() { /* ... */ }
}

Почему Java позволяет мне использовать реализацию интерфейса в качестве определения возвращаемого значения, но не 'Позволить мне использовать его как параметр параметризованного класса?

Заранее спасибо!

1 Ответ

2 голосов
/ 22 декабря 2019

Поскольку не каждый Thing является Ball

Вы можете попытаться параметризовать супер-тип следующим образом

public interface Dog<T extends Thing> {
    public List<T> fetchList();
}

public class Shepherd implement Dog<Ball> {
    public List<Ball> fetchList() { /* ... */ }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...