Используйте метод из класса T, расширяющий ArrayList <T>

Не уверен, имеет ли смысл смысл, я попытаюсь объяснить. У меня есть CustomList, расширяющий ArrayList, T, скажем, Class A1 и Class A2, распространяя класс A, который является обычным классом.

Мне нужно сделать это:

public class CustomList<T> extends ArrayList<T> { public CustomList() { super(); } public boolean add(T obj) { /*The method getCustomBoolean() is not defined for the type T*/ if(obj.getCustomBoolean()) { super.add(obj); } return true; } } 

Метод getCustomBoolean() – это метод Class A , и использование этого CustomList только для A1 и A2 , я уверен, что obj.getCustomBoolean() не вызовет исключения.

Мне нужно указать, что T является дочерним классом A.

Измените первую строку своего класса на это.

 public class CustomList<T extends A> extends ArrayList<T> 

Это указывает, что T может быть любым типом, который является подтипом A Это позволит вам использовать методы типа A на вашем объекте T в коде вашего класса.

Сделайте это так:

 class A { public boolean getCustomBoolean() { return false; } } class CustomList<T extends A> extends ArrayList<T> { private static final long serialVersionUID = 1L; public CustomList() { super(); } public boolean add(T obj) { if(obj.getCustomBoolean()) { super.add(obj); } return true; } } 

Если вы будете использовать этот CustomList только с подклассами A, вы можете объявить класс CustomList следующим образом:

 public class CustomList<T extends ClassA> extends ArrayList<T> 

Но если нет, то вам нужно переосмыслить свой дизайн.

Использование:

 class CustomList<T extends A> extends ArrayList<A> 

Это прекрасно работает:

 class A { public boolean getCustomBoolean () { return true; } }; class A1 extends A {}; class A2 extends A {}; class CustomList<T extends A> extends ArrayList<A> { public boolean add (T obj) { if ( obj.getCustomBoolean() ) { super.add(obj); } return true; } } 

Обратите внимание: если вы расширяете ArrayList<A> вы можете добавлять элементы типа A1 или A2 но если вы расширите ArrayList<T> вы будете ограничены типом объявления.

  CustomList<A1> a1 = new CustomList<>(); CustomList<A2> a2 = new CustomList<>(); // Fine. a1.add(new A1()); // Fine if you extend ArrayList<A> - not allowed if you extend ArrayList<T>. a2.add(new A1());