gpt4 book ai didi

java - 通用和类型转换 Java 规则

转载 作者:行者123 更新时间:2023-11-30 11:41:36 25 4
gpt4 key购买 nike

我已经阅读了一些通用限制

说到转换,它说我们不能对参数化类型使用转换

谁能解释在什么情况下我们可以将 Object 数据类型转换为其子类,因为泛型会在必要时自动执行转换?

假设我有以下代码:

T[] arrayVar =(T[]) new Object[1]//它会导致编译器警告,但仍然可以

为什么我应该在这种情况下使用 cast?它不是说在通用中,强制转换会自动完成吗?

最佳答案

假设T未定义为 <T extends NotObject> , 然后

T[] arrayVar =(T[]) new Object[1]// it causes a compiler warning but still okay

删除后是

Object[] arrayVar = (Object[]) new Object[1];

它有一个多余的未经检查的转换。

这不是类型安全的。

想想当你这样做时会发生什么

f(arrayVar)

在哪里

void f(Object[] out) { out[0] = "A string"; }

如果这能发生在 String 时不是 T 的子类那么你就违反了类型安全。


要解决这个问题,您可以尝试创建一个更具体类型的数组。如果你可以接受一个类型的参数

Class<T> clazz

然后你可以这样创建你的数组

T[] varArray = (T[]) Array.newInstance(clazz, 1);

哪个类型更安全,因为尝试这样做

out[0] = "";

Number[] 上例如将导致 ArrayStoreException在运行时。

它不是完全(动态)类型安全的,因为 T可能是类似 List<String> 的类型你仍然可以放一个 List<Number>List[]没有 ArrayStoreException .

关于java - 通用和类型转换 Java 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205368/

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