Как передать ограниченный параметр с помощью метода super ()

1

У меня есть три класса: абстрактные 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
}
  • 2
    Я не вижу B и C выходящих из A , ни класс A является абстрактным.
  • 0
    Вы имели в виду, что class B<T> extends A<T> ? В противном случае вы расширяете необработанный тип. Было бы очень полезно, если бы вы показали короткую, но полную программу, демонстрирующую проблему.
Теги:
generics
inheritance

1 ответ

3
Лучший ответ

С вашими определениями B и C вы расширяете необработанную форму класса A и создаете каждый собственный собственный тип типа T Необработанное для класса A означает, что стирание типа происходит на всех родовом уровне в этом классе, и придание ему становится необходимым.

Вам нужно указать, что ваш подкласс T такой же, как суперкласс T:

class B<T> extends A<T> {

а также

class C<T> extends A<T> {

Ещё вопросы

Сообщество Overcoder
Наверх
Меню