gpt4 book ai didi

java - Java 中的通用 VS 通配符

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:04 25 4
gpt4 key购买 nike

我在泛型类下有这两个方法:

public class Container<S> {
public void f2(List<Object> l1, List<?> l2) {
l1 = l2; //compilation error row #1
}

public void f3(List<?> c, List<S> l) {
c = l; //ok row #2
l = c; //compilation error row #3
}
}

我真的不明白为什么第 2 行没问题 - 如果我将此方法传递到两个列表,一个是对象类型列表,一个是字符串列表,我应该会遇到编译错误吗?

真的很想了解为什么应该/不应该编译每一行。

最佳答案

为什么会这样编译?

List<?> c, List<S> l;
c = l; // OK

List<?>意思是(或多或少)“某物列表”(或更正式地说是“未知列表”),以及 List<S>就是其中之一。

——

为什么不能编译?

List<Object> l1, List<?> l2;
l1 = l2; //compilation error

如果允许,您可以向 l1 添加任何内容(例如字符串) , 但如果 l2List<Object> 以外的任何东西(例如整数),你会在 l2 中输入错误的类型.这就是不允许此分配的原因。

另一个编译错误更微妙,也没有用例 - 也就是说,没有理由将类型化列表分配给非类型化列表 - 但通配符 ?真正的意思是“未知,但具体”。这与“任何东西”不同。这是“某物”,但我们不知道是什么。输入 S是某物,但编译器无法验证它是否与 S 相同 .

关于java - Java 中的通用 VS 通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57031548/

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