ClassCastException
运行此命令时出现错误,因为运行代码时将d隐式转换为double。但是,如果我更改对d in的引用,Object[]
则它不能是set函数的参数。如果我将set函数更改为接受a,Object[]
那么一切正常,但是如果有人在非type类型的对象上调用set,则该类将在运行时失败N
。
我需要一个可以get()
旧阵列(或其克隆)并且可以将set()
数据写入新阵列的解决方案。
public class Foo<N> {
public static void main(String[] args) {
Foo<Double> foo = new Foo<Double>();
Double[] d = foo.get();
// do stuff to d ...
foo.set(d);
}
N[] data;
public Foo() {
data = (N[]) new Object[2];
}
public N[] get() {
return (N[]) data;
}
public void set(N[] data) {
this.data = data;
}
}
要创建具有正确的运行时类型的数组,需要该类型的某种运行时表示形式。像这样的通用类Foo<N>
没有的运行时表示形式N
。
有两种解决方案:
List<N>
代替。如果可能的话,这是最好的!N
通过将传递给Class<N>
来手动添加的运行时表示形式Foo
,用于java.lang.reflect.Array.newInstance
创建数组。第二种解决方案的代码:
public Foo(Class<N> newDataClass) {
data = (N[]) Array.newInstance(newDataClass, 2);
}
Foo<Double> foo = new Foo<>(Double.class);
编辑:
如果您要获取的是现有Double
阵列的副本,则可以使用(N[]) data.clone()
。设置它不会有问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句