Я работаю над проектом на основе Java 7. Я хотел ввести универсальный параметр для одного из классов, чтобы я мог медленно исключать приведение классов, необходимое для работы кода.
Давайте представим класс, похожий на тот, над которым я работаю:
public class A {
public List<B> getB() { ... }
}
B
имеет много дочерних классов, которые при использовании необходимо приводить, что, очевидно, не идеально. Модификация, которую я хотел бы сделать, выглядит так:
public class A<T extends B> {
public List<T> getB() {...}
}
Это может устранить литье, требуемое в некоторых случаях. Тем не менее, A
используется в большой части проекта, что делает его не слишком эффективным, чтобы пройти и переписать каждый использованный случай.
Я надеялся, что использование необработанного класса A
сделает так, что getB()
вернет тип B
. Реальность такова, что если использовать raw, getB()
вернет тип Object
. Это какое-то поведение, связанное с Java 7, или я что-то упускаю? Есть ли способ заставить getB()
возвращать тип B
, когда A
является необработанным? Похоже, я не сталкивался с этой проблемой в Java 8, хотя на самом деле я тоже не работал над проектом, который плохо структурирован.
Изменить: В комментариях меня попросили конкретный пример кода, где возникает проблема. Предполагая вышеупомянутые классы (отредактированные немного, чтобы лучше соответствовать моему фактическому сценарию):
A a = new A();
for(B b: a.getB()) { // Compiler error, because `getB()` returns a list of `Object`s instead of `B`s.
...
}
A<B> a = new A<B>();
for(B b: a.getB()) { // Everything is fine here obviously
...
}