Java 具有子类型分配的通用类型灵活性

Java Generic Type flexibility with subtype assignment

我有以下结构。 A parent class:

public class MyTree<E extends MyTree<E>>{
   List<E> children;

   public MyTree(List<E> ls){
      this.children = ls;
   }
   
   public void insert(E t){
     this.children.add(t);
   }
}

一个childclass:

public class SpecTree<E> extends MyTree<SpecTree<E>>{
   private E value;

   public SpecTree(E value){
      super(new ArrayList<>());
      this.value = value;
   }
}

现在从 main 开始,我想将一棵树插入到另一棵树中。

SpecTree<Number> st = new SpecTree<>(0);
st.insert(new SpecTree<Integer>(2));      //incompatible type error

SpecTree 必须能够接受新的 children,其值是当前树的子类型。例如,我应该能够将 SpecTree<Integer> 插入 SpecTree<Number>.

是否可以不改变代码结构,只改变类型参数?

错误发生是因为 insert 期望 SpecTree<Number>,但我们给它 SpecTree<Integer>

根据 PECS,如果 SpecTree<? extends Number>insert 将能够同时获得 SpecTree<Number>SpecTree<Integer>。整数的生产者是数字的消费者。

这意味着将 E 更改为 SpecTree<? extends E>:

public void insert(E t)

因此:

class SpecTree<E> extends MyTree<SpecTree<? extends E>>

但是,现在类型参数 SpecTree<? extends E> 不符合 MyTree 中指定的界限,即 E extends MyTree<T>,因此我们也更改它:

class MyTree<E extends MyTree<? extends E>>