从泛型类中返回一个数组
当我运行代码时,由于d隐式强制转换为double,所以出现ClassCastException
错误。 但是,如果我将引用更改为Object[]
那么它不能是set函数的参数。 如果我将set函数更改为接受Object[]
那么一切正常,但如果有人调用了非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>
。 如果可能的话,这是最好的! Class<N>
传递给Foo
手动添加N
的运行时表示,使用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()
来做到这一点。 设置它不会是一个问题。
这是一个窍门。
class Foo<N> {
// Deliberately no parameters.
N[] myArray = makeArray();
private N[] makeArray(N... ns) {
return ns;
}
public N[] get() {
return myArray;
}
}
这可能看起来像没有铸造(这是一件好事),但实际上,这只是由varargs
系统完成的。
一个方便(但是详细)的方法是修改构造函数以使用数组类型的伪参数,因为您知道它在主方法中是双重的。
public class Foo<N> {
N[] data;
public Foo(N inType) {
data = (N[]) Array.newInstance(inType.getClass(), 2) ;
}
public N[] get() {
return (N[]) data;
}
public void set(N[] data) {
this.data = data;
}
public static void main(String[] args) {
Foo<Double> foo = new Foo<Double>(new Double(0));
Double[] d = foo.get();
// do stuff to d ...
foo.set(d);
}
}
链接地址: http://www.djcxy.com/p/31253.html