由于在运行代码时将 d 隐式转换为 double,因此在运行此代码时出现 ClassCastException
错误。但是,如果我将对 d 的引用更改为 Object[]
,那么它就不能成为 set 函数的参数。如果我更改 set 函数以接受 Object[]
那么一切正常,但是如果有人在不是 N< 类型的对象上调用 set ,则该类将在运行时失败
.
我需要一个可以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
的副本array 你可以用 (N[]) data.clone()
做到这一点.设置它不会有问题。
关于java - 从泛型类返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34450773/