У кого-нибудь есть хорошее объяснение, почему синтаксис ? extends
должен использоваться в дженериках? Я знаю, что синтаксис применяется, но он просто не согласуется с тем, как проверка не общего типа выполняется на Java. Например:Зачем вам нужно «? Extends» в generics
void someMethod() {
List<String> strings = new ArrayList<String>();
doSomethingWithStrings(strings);
doSomethingWithObjects(strings); // << This doesn't compile
}
void doSomethingWithStrings(Collection<String> strings) {}
void doSomethingWithObjects(Collection<Object> objects) {}
Это будет иметь ошибки компиляции, где комментировал, в то время как в следующем примере нет, очевидно, нет ошибки компиляции:
void someOtherMethod() {
String string = "worksInBothPlaces";
doSomethingWithAString(string);
doSomethingWithAObject(string);
}
void doSomethingWithAString(String string) {}
void doSomethingWithAObject(Object object) {}
Я знаю, что первый блок может быть исправлен путем изменения второй подписи до
void doSomethingWithObjects(Collection<? extends Object> objects) {}
, но опять же, что не похоже на проверку типа, выполняется в другом месте. Есть ли какой-то ясный пример, где без ? extends
некоторого родового класса было бы сложнее или даже невозможно писать.
По аналогичным вопросам/ответам см. Http://stackoverflow.com/search?q=java+covariance –