Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型和参数化构造函数_Java - Fatal编程技术网

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)