从泛型类返回数组

avi*_*cks 7 java

ClassCastException运行这个时遇到错误,因为在运行代码时d隐式转换为double.但是,如果我将引用更改为d in,Object[]则它不能成为set函数的参数.如果我将set函数更改为接受a Object[]然后一切正常,但是如果有人在非类型的对象上调用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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Lii*_*Lii 1

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

有两种解决方案:

  1. 使用 aList<N>代替。如果可以的话这是最好的!
  2. N通过传入Class<N>to 来手动添加 的运行时表示Foo,用于java.lang.reflect.Array.newInstance创建数组。

第二种解决方案的代码:

public Foo(Class<N> newDataClass) {
    data = (N[]) Array.newInstance(newDataClass, 2);
}

Foo<Double> foo = new Foo<>(Double.class);
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您想要做的是获取现有数组的副本,Double您可以使用(N[]) data.clone(). 设置它不会有问题。