РЕДАКТИРОВАТЬ: Здесь есть еще одна складка, которую я пропустил, которая, как оказалось, имеет большое значение. Сигнатура метода doAnotherThing
выглядит следующим образом:
<T extends Bar> T doAnotherThing(List<Foo<T>> foo) {
return foo.get(0).doSomething();
}
Не обращайте внимания на тот факт, что это List
, просто обратите внимание на тот факт, что List
- это универсальный класс / интерфейс. Я вызываю метод так:
doAnotherThing(new ArrayList<FooImpl>);
Итак, у меня есть класс и интерфейс, определенные так:
abstract class Bar {
// some neat stuff
}
class BarImpl extends Bar {
// some cool stuff
}
interface Foo<T extends Bar> {
T doSomething();
}
class FooImpl implements Foo<BarImpl> {
BarImpl doSomething() {
// Does something awesome
}
}
Это все прекрасно, денди и прекрасно работает.
Теперь у меня есть такой метод:
<T extends Bar> T doAnotherThing(List<Foo<T>> foo) {
return foo.get(0).doSomething();
}
Этот метод является универсальным методом в совершенно другом классе и не входит в приведенную выше цепочку.
Однако, когда я пытаюсь использовать этот метод следующим образом, я получаю сообщение об ошибке, говорящее, что типы не совпадают:
doAnotherThing(new FooImpl());
FooImpl
реализует Foo<T>
, так что я не вижу, как это ошибка? Может я что то недопонимаю? Спасибо