求助:用Java泛型实现Op类列表仅允许同一父类及其子类元素
解决Op类泛型限制问题
正确实现代码
class A {} class Aa extends A {} class B {} class Bb extends B {} class Op<T> { // 用List<T>存储对象,允许添加T及其子类(子类可向上转型为T) private List<T> objects = new ArrayList<>(); // 方法参数直接声明为T,子类对象可自动适配 public void addObj(T o) { objects.add(o); } } public class Main { public static void main(String[] args) { A a1 = new A(); Aa a2 = new Aa(); B b1 = new B(); Bb b2 = new Bb(); // 创建Op实例时指定类型为A,此实例只能接受A及其子类 Op<A> op = new Op<>(); op.addObj(a1); // 正常允许 op.addObj(a2); // 正常允许(Aa是A的子类) op.addObj(b1); // 编译错误,B与A类型不兼容 } }
你的错误代码分析
List<? extends T>的问题:这种上界通配符声明的列表,编译器无法确定其具体的泛型类型(比如是List<A>还是List<Aa>),因此会限制add方法的调用(仅能添加null),导致无法正常存入对象。T<? extends T>的语法错误:T是类型参数,不是泛型类,不能用类似泛型类的语法声明参数类型,这属于无效写法。
实现说明
通过给Op类定义泛型参数T,在创建Op实例时指定具体的根类型(比如A或B),就能在编译阶段强制限制该实例只能存储T及其子类的对象,完全符合你“只能添加某一类及其子类,禁止跨类型添加”的需求。
内容的提问来源于stack exchange,提问作者UsiKakULisi
相关产品推荐
相关产品推荐

