当前位置: 首页 > 知识库问答 >
问题:

在java中将对象[]强制转换为引用类型数组

公羊渝
2023-03-14

在通用堆栈的实现中,使用了以下习惯用法,并且没有任何问题

public class GenericStack<Item> {
    private int N;
    private Item[] data;    

    public GenericStack(int sz) {
        super();
        data = (Item[]) new Object[sz];

    }
        ...
}

但是,当我尝试以下操作时,它会导致ClassCastException

String[] stra = (String[]) new Object[4];

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

这个你怎么解释?

共有3个答案

殳自怡
2023-03-14

我认为,如果一个对象类引用指向任何子类对象,如String类或任何其他类,那么只有我们可以将对象类引用转换为该特定类(我们已经创建了该对象并将其分配给对象类ref ),并为其分配一个引用。而如果我们创建一个直接的对象类的对象(正如你所提到的)就行不通了。

示例

Object[] obj = new String[4];
String[] stra = (String[]) obj;

上述代码不会生成任何ClassCastException。

希望这有帮助

桂丰
2023-03-14

由于泛型类型擦除项数组有效地成为对象数组。因此,类型匹配。但是当你用具体类型字符串来做它时,它不会。未应用任何类型擦除,并且会失败。

王景山
2023-03-14

new Object[4]转换为String[]不起作用,因为Object[]不是String[],就像Object不是String一样。

第一个示例由于类型擦除而起作用。在运行时,类型参数Item已被擦除到Object。但是,如果您尝试将数组分配给可实现的类型,例如,如果data不是私有,它同样会失败:

String[] strings = new GenericStack<String>(42).data;

这同样会抛出一个< code>ClassCastException,因为实际上是一个< code>Object[]将被转换为< code>String[]。

 类似资料:
  • 对API控制器的远程调用(通过RestTemboard)(从一侧返回已知对象的List([]),从远程侧返回未知类型的对象)返回

  • 问题内容: 我正在使用返回“对象”类型的普通对象的Web服务。调试清楚地表明此对象中存在某种Array,因此我想知道如何将“ Object”转换为Array(或类似对象)? 我尝试了以下方法: 但是没有任何效果。我总是得到一个InvocationTargetException。 我究竟做错了什么? 编辑 : 可悲的是,我不得不删除指向显示Eclipse调试器输出的图像的链接,因为它不再可用。请不要

  • 有没有一种简单的方法可以做到这一点: 编辑:我写了一份正确答案的工作副本:

  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 问题内容: 在Java中,从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,而第一行却没有? 问题答案: 这是因为在执行时,由于 类型Erase 不会 真正 检查对象是否为a 。真的只是将其投射到。例如: __ 有关更多信息,请参见Angelika Langer的Java泛型常见问题解答 ,尤其是类型擦除部分。

  • 我正在创建一个由数组支持的泛型类型堆栈。当我尝试创建泛型类型数组时,Java不允许我这样做。有人告诉我,我必须创建一个类型为Object的数组,并将其转换为泛型类型。我已经将对象数组转换为类型,但如何处理Java不断给我的未检查类型错误? 这就是我目前所处的位置。 更新:我正在创建一个对象数组,然后在方法的末尾将返回类型转换为T类型。