gpt4 book ai didi

java - 通配符 VS T - 获取并添加到列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:07 26 4
gpt4 key购买 nike

考虑以下程序:

public class WCVsT {

private void fooWC(List<? extends Number> l ) {
l.add(l.get(0)); // 1 - A Compile time error
}

private <T extends Number> void fooT(List<T> l) {
l.add(l.get(0)); // 2 - No compile time error
}
}

我有几个问题:

  1. 在 1(在 fooWC 方法中)我正在从列表中检索一个元素并且 将它添加回同一个列表——它有什么类型不安全的地方?为什么 编译器不允许这样的操作?我可以理解编译器不允许将 Cat 添加到 List<? extends Animal>因为我本可以将狗传递给 fooWC,但我的程序现在显示的应该始终是安全的。不是吗?
  2. 为什么使用 fooT 方法 类型参数而不是通配符允许这样的操作,而 fooWC - 通配符版本没有?

任何帮助/提示将不胜感激。提前致谢。

最佳答案

一个有效而另一个无效的原因是,虽然这两种方法都使用绑定(bind) <T extends Number> ,在第二种方法(类型化方法)中,类型虽然未知,但在整个方法中都是相同类型 - 在调用期间该类型被锁定为特定(但未知)类型。

在第一种方法(非类型化方法)中,编译器只知道未知列表已经添加了一个未知类型,这可能是一个不同未知类型。对人类来说很明显它必须是同一类型,因为目标和源是同一对象,这一事实对编译器来说是不可见的。

第一个版本被编译器认为在同一个桶中:

List<Integer> list1;
List<Double> list2;
list1.add(list2.get(0);

它只知道类型都以 Number 为界,但不一定是相同类型。

第二个版本在同一个桶中:

List<Integer> list1;
List<Integer> list2;
list1.add(list2.get(0);

编译器不知道类型,但知道它是相同类型。

关于java - 通配符 VS T - 获取并添加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170297/

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