У меня есть устаревший класс, в котором сам класс не является универсальным, но один из его методов возвращаемого типа использует дженерики:
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 универсальным для другого метода, который не указан в приведенном выше примере кода. Мой вопрос является образовательным относительно того, почему вышеизложенное не может быть сделано.