gpt4 book ai didi

java - 对泛型参数类型的错误转换不会在 Java 中抛出 ClassCastException

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:38 25 4
gpt4 key购买 nike

所以,我有一个相当深奥的问题。我正在尝试创建一个有点通用但类型化的属性收集系统。它依赖于一个似乎是错误的核心假设。代码说明了这个问题:

import java.lang.Integer;

public class Test {
private static Object mObj = new String("This should print");

public static void main(String[] args ) {
String s = Test.<String>get();
System.out.println(s);

try {
// actual ClassCastException reported HERE
int i = Test.<Integer>get();
} catch ( ClassCastException e ) {
System.out.println("Why isn't the exception caught earlier?");
}

int i2 = getInt();
}

public static <T> T get() {
T thing = null;
try {
// Expected ClassCastException here
thing = (T)mObj;
} catch ( ClassCastException e ) {
System.out.println("This will *not* be printed");
}
return thing;
}

// This added in the edit
public static Integer getInt() {
return (Integer)mObj;
}
}

编译运行后输出为

This should print
Why isn't the exception caught earlier?

在静态方法“get”中,我试图转换为泛型参数类型 T。底层成员 (mObj) 是 String 类型。在第一次调用中,Generic 参数是兼容类型,因此应用程序会适本地打印字符串。

在第二次调用中,Generic 参数是 Integer 类型。因此,get 方法中的转换应该会失败。我希望它会抛出一个 ClassCastException(打印语句“This will *not* be printed”。)但事实并非如此。

相反,当尝试将返回值分配给变量“i”时,在 get 方法返回后抛出转换异常。这是问题:

这个延迟转换错误的解释是什么?

** 编辑 **为了有趣和完整,我添加了一个非通用的 getInt 方法来说明我希望得到的响应。当编译器知道类型时会发生惊人的事情。

最佳答案

这是因为 get 中的类型转换方法(应生成编译器警告)是未经检查的强制转换。编译器不知道什么T是你调用thing = (T) mObj;的时候所以它不知道类型转换是否不应该编译。

编译后,由于类型删除,生成的字节码调用方法get返回 Object ( T 被删除并替换为 Object )并且转换简单地转换为:

Object thing = null;
try {
thing = mObj;

get 返回结果后 进行检查方法,即 int i = Test.<Integer> get();相当于:

Object o = Test.get();
int i = ((Integer) o).intValue();

关于java - 对泛型参数类型的错误转换不会在 Java 中抛出 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37207811/

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