У меня есть унаследованный класс, который сам по себе не является универсальным, но один из его методов, возвращающий тип, использует универсальные:
public class Thing {
public Collection<String> getStuff() { ... }
}
getStuff()
использует шаблоны для возврата коллекции строк. Поэтому я могу перебрать getStuff()
, и нет необходимости приводить элементы к String
:
Thing t = new Thing();
for (String s: t.getStuff()) // valid
{ ... }
Однако, если я сам изменю Thing
на общий, но оставлю все остальное таким же:
public class Thing<T> {
public Collection<String> getStuff() { ... }
}
и затем продолжайте использовать неуниверсальную ссылку на Thing
, getStuff()
больше не возвращает Collection<String>
и вместо этого возвращает нетипизированный Collection
. Таким образом, код клиента не компилируется:
Thing t = new Thing();
for (String s: t.getStuff()) // compiler complains that Object can't be cast to String
{ ... }
Почему это? Какие обходные пути?
Я предполагаю, что, используя неуниверсальную ссылку на обобщенный класс, Java отключает все обобщенные элементы для всего класса. Это боль, потому что теперь я сломал свой клиентский код, сделав Thing универсальным.
Редактировать: Я делаю Thing универсальным для другого метода, который не указан в примере кода выше. У меня вопрос воспитательный, почему вышеупомянутое не может быть сделано.