从泛型类返回数组

航空兵

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;
    }

}
i

要创建具有正确的运行时类型的数组,需要该类型的某种运行时表示形式。像这样的通用类Foo<N>没有的运行时表示形式N

有两种解决方案:

  1. 使用一个List<N>代替。如果可能的话,这是最好的!
  2. 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章