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>>
我有以下结构。 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>>