gpt4 book ai didi

Java 类型 T 的泛型集合,添加会引发编译错误,但检索和添加不会抛出编译错误

转载 作者:行者123 更新时间:2023-12-02 02:00:44 24 4
gpt4 key购买 nike

我了解通配符 ? 和类型 T 之间的区别

但是无法理解下面的代码,在方法 m3 中我传递了 String 类型的集合。
现在,在方法 m3 中,当我尝试将字符串添加到集合中时,它不允许我异常(exception):

The method add(T) in the type List is not applicable for the arguments (String)

但是,在方法 m4 中,我们从列表中提取一个元素,然后再次添加它。

<1>if T extends String then 在方法 m3 中 为什么不允许添加 String ?

<2>在方法 m4 中,当我从列表中提取对象并再次添加它时,这是允许的。是因为当我提取对象时,对象是 T 类型,因此添加它时是允许的吗?

有点奇怪的行为 - 我想我隐约知道为什么会发生这种情况,但很高兴听到其他人的想法?

package generics.wildcardVsT;

import java.util.ArrayList;
import java.util.List;

public class Ex1 {
public static void main(String[] args) {
System.out.println("hello");
List <String> list1 = new ArrayList<String>();
List <String> list2 = new ArrayList<String>();
List <String> list3 = new ArrayList<String>();
List <String> list4 = new ArrayList<String>();
list4.add("abc");

m1(list1);
m2(list2);
m3(list3);
m4(list4);
}

/** no compilation errors **/
public static void m1(List<String> list) {
list.add("abc");
}

/** this will not compile because of wildcard - this is understood **/

public static void m2(List<? extends String> list) {
list.add("abc");
}
/** this is not understood - why will this not compile ? **/
public static <T extends String>void m3(List<T> list) {
list.add("abc");
}

/** strangely this actually compiles ! **/
public static <T extends String>void m4(List<T> list) {
list.add(list.get(0));
}

}

最佳答案

m3 采用 T某个碰巧扩展 String 的类,但 list.add("abc"); 正在将 String 添加到 T

列表中

T 可以是 class SuperCoolString extends String { ... } 在这种情况下 list.add("abc"); 将是错了。

m4 只是list 添加一个 T 元素

I don't think that you can/should normally extend String but that's not really important here ...

关于Java 类型 T 的泛型集合,添加会引发编译错误,但检索和添加不会抛出编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623738/

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