gpt4 book ai didi

java - 尝试在泛型中使用原始类型时出现奇怪的编译时行为

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

import java.lang.reflect.Array;

public class PrimitiveArrayGeneric {
static <T> T[] genericArrayNewInstance(Class<T> componentType) {
return (T[]) Array.newInstance(componentType, 0);
}

public static void main(String args[]) {
int[] intArray;
Integer[] integerArray;

intArray = (int[]) Array.newInstance(int.class, 0);
// Okay!

integerArray = genericArrayNewInstance(Integer.class);
// Okay!

intArray = genericArrayNewInstance(int.class);
// Compile time error:
// cannot convert from Integer[] to int[]

integerArray = genericArrayNewInstance(int.class);
// Run time error:
// ClassCastException: [I cannot be cast to [Ljava.lang.Object;
}
}

我试图完全理解泛型在 Java 中的工作原理。在上面代码片段的第三个赋值中,事情变得有点奇怪:编译器提示 Integer[] 无法转换为 int[]。当然,这个说法 100% 正确,但我想知道编译器为什么要提出这样的提示。

如果您注释该行,并遵循编译器的“建议”(如第四个作业中所示),编译器实际上感到满意!!! 现在代码编译得很好!当然,这很疯狂,因为就像运行时行为所暗示的那样, int[] 无法转换为 Object[] (这就是 T[] 在运行时被类型删除)。

所以我的问题是:为什么编译器“建议”我分配给 Integer[] 而不是第三次分配?编译器如何得出这个(错误的!)结论?

<小时/>

到目前为止,这两个答案存在很多困惑,因此我创建了另一个令人困惑的示例来说明此处的根本问题:

public class PrimitiveClassGeneric {    
static <T extends Number> T test(Class<T> c) {
System.out.println(c.getName() + " extends " + c.getSuperclass());
return (T) null;
}
public static void main(String args[]) {
test(Integer.class);
// "java.lang.Integer extends class java.lang.Number"

test(int.class);
// "int extends null"
}
}

我是唯一一个认为编译器让上述代码编译绝对疯狂的人吗?

例如,在上面的代码中打印 c.getSuperclass().getName() 并不是不合理的,因为我指定了 T extends Number。当然,现在当 c == int.class 时,getName() 会抛出 NullPointerException,因为 c.getSuperclass() == null .

对我来说,这是首先拒绝编译代码的一个很好的理由。

<小时/>

也许是终极疯狂:

    int.class.cast(null);

该代码编译并且运行良好。

最佳答案

int.class的类型是 Class<Integer> ,所以genericArrayNewInstance()将推断返回 Integer[] 。但该函数实际上创建了一个 int[] ,因此返回时会出现类转换异常。基本上,强制转换为 T[]在这种情况下,函数内部是不合法的,因为 int[]不是T[] (基元不能在类型变量中使用)。您不能一般地处理原始数组类型;所以你要么必须让你的方法只返回类型 Object ,或者您必须为引用类型和基本类型创建单独的方法。

关于java - 尝试在泛型中使用原始类型时出现奇怪的编译时行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2453359/

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