gpt4 book ai didi

java - 对泛型方法中的 Cast List 感到困惑?

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

    class A {
private int a;
}

public static <T> List<T> listStrToListT(String str) {
String[] idStrs = str.replace(" ", "").split(",");
List<T> uids = new ArrayList<>();
for (String idStr : idStrs) {
uids.add((T) idStr);
}
return uids;
}

public static void main(String[] args) {
List<A> lst = listStrToListT("1,2,3");
System.err.println(lst);
}

这个程序没有任何错误。但是当我调试时(如下图所示):lstList<String> .为什么我直接赋值List<String> (右侧)至List<A> (左侧)?

Debug error Image

最佳答案

请记住,Java 中的泛型只是编译时的事情。在运行时,所有泛型参数都会被删除为非泛型类型。

从编译器的角度来看,listStrToListT可以返回任何类型的List来电者想要的不仅仅是List<String> 。您通过 (1) 使 listStrToListT 让编译器相信了这一事实。通用和 (2) 类型转换 idStrT 。你是在说“我确信这个转换在运行时会起作用。别担心,编译器!”这个 Actor 阵容肯定有腥味,不是吗?如果 T 会怎么样?是 A ...

无论如何,现在List<A> lst = listStrToListT("1,2,3");编译为 listStrToListT “可以返回任何类型的 List ”,如前所述。你会想象 T推断为 A ,以及您的 Actor listStrToListT会在运行时失败,但事实并非如此。

现在是运行时了,所有泛型类型都被删除,使您的代码如下所示:

public static List listStrToListT(String str) {
String[] idStrs = str.replace(" ", "").split(",");
List uids = new ArrayList();
for (String idStr : idStrs) {
uids.add((Object)idStr);
}
return uids;
}

// main method:
List lst = listStrToListT("1,2,3");
System.out.println(lst);

请注意,强制转换为 T成为 Object 的强制转换,这在这里确实是多余的。

打印列表只需调用 toString在每个 Object s,所以那里没有进行任何转换。

请注意,在编译时“闻起来有腥味”的东西在编译时是完全有效的。可疑的转换成为 Object 的完全有效(且冗余)的转换。 ! Actor 们去哪儿了?

仅在必要时才插入强制转换。这就是泛型在 Java 中的工作原理。那么让我们创造一个这样的情况。假设 A你有一个用于该字段的 getter a ,而不是打印整个列表,而是打印 a第一个元素:

// main method:
List<A> lst = listStrToListT("1,2,3");
System.out.println(lst.get(0).getA());

好吧,能够访问getA ,需要插入强制转换:

List lst = listStrToListT("1,2,3");
System.out.println(((A)lst.get(0)).getA());

否则lst.get(0)类型为 Object ,和Object没有 getA方法。

此时你的程序就会崩溃。

关于java - 对泛型方法中的 Cast List 感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60465953/

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