У меня есть три класса: абстрактные A и два B и C, которые расширяют A.
class A<T> {
ArrayList<T> someField;
A() {
someField = new ArrayList<T>();
}
ArrayList<T> getSomeField() { return someField; }
}
Теперь у меня есть B и C
class B<T> extends A {
B() {
super();
}
}
class C<T> extends A{
C() {
super();
}
}
Когда я пытаюсь использовать getSomeField, который является другим типом для B, а CI должен указать, какой тип он есть. И мой вопрос заключается в том, как передать параметр T из класса B в A, чтобы избежать указания типа ArrayList, использующего, например, для каждого цикла. Если это вообще возможно.
Пример:
Я хочу:
B obj = new B<T>();
for (T item: B.getSomeField) {
do something
}
Я должен:
B obj = new B<T>();
for (T item: (ArrayList<T>)B.getSomefield) {
do something
}
С вашими определениями B
и C
вы расширяете необработанную форму класса A
и создаете каждый собственный собственный тип типа T
Необработанное для класса A
означает, что стирание типа происходит на всех родовом уровне в этом классе, и придание ему становится необходимым.
Вам нужно указать, что ваш подкласс T
такой же, как суперкласс T
:
class B<T> extends A<T> {
а также
class C<T> extends A<T> {
B
иC
выходящих изA
, ни классA
является абстрактным.class B<T> extends A<T>
? В противном случае вы расширяете необработанный тип. Было бы очень полезно, если бы вы показали короткую, но полную программу, демонстрирующую проблему.