gpt4 book ai didi

java - 带有通用可变参数的 ClassCastException?

转载 作者:行者123 更新时间:2023-12-02 09:25:50 25 4
gpt4 key购买 nike

我有一个通用界面

{
void evaluate( TYPE... things );
}

我有一个带有签名的通用方法

<TYPE> void genericmethod( INTERFACE<TYPE> interfase, TYPE thing )
{
//the following line throws the ClassCastException
interfase.evaluate( thing );
}

PCard 是我项目中的一个名称。

所以最终的调用是

INTERFACE<PCard> interfase = new WorkingImplementation<PCard>();
PCard pcard = new PCard();

当它尝试调用将单个 pcard 转换为可变参数数组时,这似乎会在通用方法中抛出 ClassCastException。

genericmethod( interfase, pcard );

如果不调用泛型方法,直接调用接口(interface),问题就解决了。

interfase.evaluate( pcard );

什么原因导致异常(内部)? (我个人猜测是java已经不堪重负了)

异常消息:

java.lang.ClassCastException: 类 [Ljava.lang.Object;无法转换为类 [Llib.cardgame.CG$PCard; ([Ljava.lang.Object; 位于加载程序 'bootstrap' 的 java.base 模块中; [Llib.cardgame.CG$PCard; 位于加载程序 'app' 的未命名模块中)

最佳答案

简短回答:泛型和数组不能混合。使用List<? extends TYPE> things相反。

泛型只是编译器的一个技巧。它们在运行时不存在。数组在运行时具有不同的类型,例如 String[]Number[] 。但由于泛型类型在运行时不存在,因此编译器不可能生成生成泛型类型数组的代码。 (对 varargs 方法的调用隐式创建一个数组来保存 varargs 参数。)

在您的情况下,编译器会发出有关此问题的警告,并生成尽可能接近您想要的代码:每当调用 varargs 方法时创建的隐式数组的生成代码将为 Object[] (因为 TYPE ,我猜,没有上限)。

如果您打开所有编译器警告,您将收到通知。正确解决所有编译器警告(也就是说,不要使用 @SuppressWarnings )将保证您不会得到像现在这样的晦涩的惊喜。

我推荐Gilad Bracha’s generics tutorial 。我发现它对于理解泛型的工作原理非常有值(value)。

关于java - 带有通用可变参数的 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58355391/

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