Java 泛型和参数化构造函数
这是关于参数化方法的扩展。我正在读同一本书。在前面问题中的示例之后,作者改进了Java 泛型和参数化构造函数,java,Java,这是关于参数化方法的扩展。我正在读同一本书。在前面问题中的示例之后,作者改进了 BinaryTree<T extends Comparable<? super T>> 示例代码不使用我的构造函数编译: public static void main(String[] args) { Manager[] managers = { new Manager("Jane", 1), new Manager("Joe", 3), new Manager("Freda",
BinaryTree<T extends Comparable<? super T>>
示例代码不使用我的构造函数编译:
public static void main(String[] args) {
Manager[] managers = { new Manager("Jane", 1), new Manager("Joe", 3), new Manager("Freda", 3), new Manager("Bert", 2), new Manager("Ann", 2), new Manager("Dave", 2) };
BinaryTree<Person> people = new BinaryTree<>(managers);
}
publicstaticvoidmain(字符串[]args){
经理[]经理={新经理(“简”,1),新经理(“乔”,3),新经理(“弗雷达”,3),新经理(“伯特”,2),新经理(“安”,2),新经理(“戴夫”,2)};
BinaryTree人员=新的BinaryTree(管理者);
}
在上一个问题中更改add()方法和更改此构造函数之间有什么区别?为什么我不能在构造函数中传递t的子类型?对于第二个构造函数,当编译器看到
new BinaryTree<>(managers)
对于第一个构造函数
public <E extends T> BinaryTree(E[] items) {
for(E item : items) {
add(item);
}
<E extends T> BinaryTree(E[] items)
BinaryTree(E[]项)
在表达式newbinarytree(managers)
现在推断出E=Manager
;然而,T
尚未推断出来。编译器然后查看目标类型Binary
,这有助于推断T=Person
Java类型推断相当混乱。为什么任何程序员都愿意学习我刚才描述的内容?教训是,当有疑问时,显式地提供类型参数
在这两个构造函数之间,我肯定会选择
BinaryTree(T[]items)
。E
版本只是更加复杂,没有任何好处(尽管在这个特定的例子中它工作得更好)这一切都是有意义的,谢谢。因此,我想使用二进制树(E[]项)没有什么意义,因为T[]
arg将接受任何X[]
,其中X
是T
的子类型。注意:这不适用于列表
。如果我们想要接受任何列表
,其中X
是T
的子类型,我们需要列表
new BinaryTree<Person>(managers);
new BinaryTree((Person[])managers);
<E extends T> BinaryTree(E[] items)