gpt4 book ai didi

java - 泛型和参数化构造函数

转载 作者:行者123 更新时间:2023-11-30 04:28:59 27 4
gpt4 key购买 nike

这是 previous question 的扩展关于参数化方法。我正在读同一本书。在上一个问题的例子之后,作者改进了

BinaryTree<T extends Comparable<? super T>>

通过添加以下构造函数再次类(这次他确实这样做了)

public  <E extends T> BinaryTree(E[] items) {
for(E item : items) {
add(item);
}

本着上一个问题的精神,我尝试了这个构造函数:

public BinaryTree(T[] items) {
for(T item : items) {
add(item);
}
}

并且示例代码无法使用我的构造函数进行编译:

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);
}

更改上一个问题中的 add() 方法和更改此构造函数有什么区别?为什么我不能在构造函数中传递 T 的子类型?

最佳答案

对于第二个构造函数,当编译器看到

new BinaryTree<>(managers)

它需要推断T对于<> 。在本例中,推理基于 managers :T[]=Manager[] => T=Manager .

因此该表达式产生 BinaryTree<Manager> ,不能分配给BinaryTree<Person> .

两种解决方法:

new BinaryTree<Person>(managers);

new BinaryTree((Person[])managers);
<小时/>

对于第一个构造函数

<E extends T> BinaryTree(E[] items)

我们现在有两件事要推断,ET ,在表达式 new BinaryTree<>(managers)

现在E=Manager被推断;然而T还没有推断出来。然后编译器查看目标类型 Binary<Person> ,这有助于推断 T=Person

<小时/>

Java 类型推断相当困惑。为什么程序员愿意学习我刚才描述的内容?教训是,当有疑问时,明确提供类型参数。

在这两个构造函数之间,我肯定会选择BinaryTree(T[] items)E版本只是更复杂,没有任何好处(尽管它恰好适合这个特定的示例)

关于java - 泛型和参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com