在通用堆栈的实现中,使用了以下习惯用法,并且没有任何问题
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;
这个你怎么解释?
我认为,如果一个对象类引用指向任何子类对象,如String类或任何其他类,那么只有我们可以将对象类引用转换为该特定类(我们已经创建了该对象并将其分配给对象类ref ),并为其分配一个引用。而如果我们创建一个直接的对象类的对象(正如你所提到的)就行不通了。
示例:
Object[] obj = new String[4];
String[] stra = (String[]) obj;
上述代码不会生成任何ClassCastException。
希望这有帮助
由于泛型类型擦除项数组有效地成为对象数组。因此,类型匹配。但是当你用具体类型字符串来做它时,它不会。未应用任何类型擦除,并且会失败。
将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类型。