从泛型类中返回一个数组

当我运行代码时,由于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

    上一篇: Returning an Array from a generic class

    下一篇: File uploads in ColdFusion 10's REST API framework