首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >诱骗JVM转换数组

诱骗JVM转换数组
EN

Stack Overflow用户
提问于 2015-07-05 12:59:17
回答 2查看 78关注 0票数 1

我想知道是否有一种方法可以将SuperType数组转换为和数组SubType。就像这样:

代码语言:javascript
复制
SubType[] subArray = (SubType[])someSuperTypeArray;

我知道在运行时,这会抛出一个ClassCastException。转换数组的一种方法是将其复制到另一个数组中。在我的例子中,复制它不是一种选择。

我能否欺骗JVM相信强制转换是有效的,并绕过类类型检查?创建对SuperType数组的引用,通过该引用可以将其视为某些SubType数组。(可能面临无法解释的错误的危险)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-05 13:22:11

如果您将数组定义为

代码语言:javascript
复制
SuperType[] array = {element1, element2};
SubType[] array2 = (SubType[]) array;

它将不起作用,但是您可以这样做:

代码语言:javascript
复制
SuperType[] array = new SubType[]{element1, element2};
SubType[] array2 = (SubType[]) array;

您只需确保字段array在转换时始终必须是SubType的数组。

票数 3
EN

Stack Overflow用户

发布于 2015-07-05 13:43:23

someSuperTypeArray只能指向两个可能的数组实例。

  1. SuperType someSuperTypeArray = new SuperType[10];:您可以向这个数组中添加SuperType对象或SubType对象
  2. SuperType someSuperTypeArray = new SubType[10];:您只能向这个数组中添加SubType对象。(从技术上讲,您可以在编译时将SuperType对象添加到该数组中,但这将导致在运行时生成ArrayStoreException )

让我们假设一下,在第1种情况下,您确实设法使JVM允许将someSuperTypeArray引用转换为SubType[]引用。如果someSuperTypeArray有一个SuperType类型的元素,该怎么办?您不能期望强制转换隐式地丢弃所有SuperType元素。

在第2种情况中,如果您只想将SuperType[]引用转换到SubType[]引用,那么对SubType[]数组实例使用SubType[]引用是否有意义。首先只需使用SubType[]引用即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31230580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档