gpt4 book ai didi

java - 在具有泛型方法的 Java 泛型中使用 'extends' 和 'super' 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:36:55 25 4
gpt4 key购买 nike

有一个方法:

public static <T> void addandDisp(Collection<T> cs, T t)

这是通过以下方式调用的:

List<? extends Object> ls2 = new LinkedList<Number>();
addandDisp(ls2,new Object());

这会产生编译时错误。另一方面,如果我们只有一个参数,则调用成功。这是为什么?

此外,这是成功的:

List<? super String> ls1 = new LinkedList<String>();
addandDisp(ls1,new String());

虽然这不是:

List<? super String> ls1 = new LinkedList<Object>();
addandDisp(ls1,new Object());

底层逻辑是什么?

最佳答案

我假设 addandDisp表示添加和显示

当你有一个集合时,定义为:

List<? extends Object> ls2 = new LinkedList<Number>();

这意味着编译器将允许您将集合分配给 Object 的所有可能的未知子类型 .因为你有操作 add ,编译器拒绝给你绿灯,因为它不知道所提供的对象的类型是否满足对象的未知子类型的限制。这称为协方差


类似地,当你有这样的定义时:

List<? super String> ls1 = new LinkedList<String>();

编译器允许您分配 ls1到:

  • LinkedList<String>(); //you can add Strings to the list
  • LinkedList<Object>(); //you can add Strings and Objects to the list

在这种情况下,编译器将完全知道您尝试传递的对象是否满足集合泛型类型的子类型的条件。这称为逆变

更多信息:

关于java - 在具有泛型方法的 Java 泛型中使用 'extends' 和 'super' 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120951/

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