【发布时间】:2012-01-09 19:13:40
【问题描述】:
我正在制作的程序中有以下代码:
01 public class Clazz<T>
02 {
03 T[] t;
04
05 public Clazz<T> methodA(int... ints)
06 {
07 Clazz<Integer> ints2 = new Clazz<>();
08 int remInd[] = new int[t.length - ints2.t.length];
09 return this;
10 }
11 }
但是当我运行方法 methodA 时,我得到了这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
at Clazz.methodA(Clazz.java:8)
为什么会出现此错误?当然,与所讨论的巨大类相比,我展示的代码是不完整的(例如,数组t 在检查其长度时不会为空),但我相信我已经展示了所有重要的东西。为什么不运行?
注意:我是用 JDK 1.7 做这个的,所以这就是第 7 行编译和工作的原因
工作解决方案
无论出于何种原因,我决定实施以下解决方案,并且成功了:
01 public class Clazz<T>
02 {
03 T[] t;
04
05 public Clazz<T> methodA(int... ints)
06 {
07 Clazz<Integer> ints2 = new Clazz<>();
08 int remInd[] = new int[t.length - ints2.length()];
09 return this;
10 }
11
12 public int length()
13 {
14 return t.length;
15 }
16 }
虽然这是一个解决方案,但我仍然想知道它为什么有效。
【问题讨论】:
-
您缺少部分代码,即初始化
t的位置。这很重要。 -
第 7 行真的可以编译吗?
-
就像我说的,这是 841 行类的 11 行版本。如果我向您展示发生的一切,这个示例将比需要的更大。只要确保一切都编译,并且 t 总是被初始化(我有几个构造函数,所有这些都确保了这一点)。另请参阅最新编辑
-
@Supuhstar:我说具体的事情很重要,因为具体的事情确实很重要。我没有要求其他 829 行,只是那一个特定的行。您如何初始化
t决定了您是否会收到该错误。在这种情况下,我不得不假设您使用Object[]对其进行初始化。 -
@Supuhstar:在尝试访问阵列时,您仍然可能在其他点遇到麻烦。您可能会考虑在我的回答中采纳建议,而根本不声明通用数组。他们从来都不是一个好主意。如果您有一个由数组支持的泛型类,那么该数组应该 100% 封装,在这种情况下,没有理由不使用
Object[]。关于为什么您的“解决方案”有效,我在回复@DHall 对我的回答的评论时解释了这一点。