将对象返回Double或double的泛型方法

时间:2012-11-02 00:09:49

标签: java generics

我想从单个方法返回2种不同类型的类(List<double[]>List<Double[]),如下面的伪代码所示。怎么做到这一点?

已编辑的代码和注释:Eclipse甚至不允许编译,因为请求更改返回或数据类型。我知道YserieScaledCasted必须手动铸造。

protected List<E[]> getYserieRescaledList(Class<E> c) {

    if (Double[].class == c)
        return this.YserieScaled;
    else if (double[].class == c)
        return this.YserieScaledCasted;

}

EDIT2:我发现问题的正确性只是按照here所述重载方法。

3 个答案:

答案 0 :(得分:2)

你意识到你正在返回数组列表,对吧? : - )

简短回答:

  • 即使您传入Class<E>,也不能在泛型类型上使用instanceof运算符,因此无法执行上面概述的if语句

  • 以下是ILLEGAL,并且不会在两个instanceof运算符中的每一个上编译:

class trash {
    protected <T> List<T[]> getYserieRescaledList(Class<T> cl) {
       List<T[]> result = null;
       if (cl instanceof Class<Double>) {
               result = ...;
       } else if (cl instanceof Class<double>) {
               result = ...;
       }
       return result;
    }
}
  • 这样做的原因是泛型是仅编译时的构造。所有实例化的泛型类都转换为非泛型类,插入了类型并执行了类型转换等。在运行时询问泛型类是否使用特定类型进行实例化是没有意义的 - 泛型类已被替换为非类通用类

  • 相反,删除if语句并简单地使用实例化类型来声明变量&amp;数组,然后使用您的算法填充它们并返回结果:

class treasure {
    protected <T> List<T[]> getYserieRescaledList(Class<T> cl) {
       List<T[]> result = null;
       // apply general algorithm here to populate the array
       // will work identically whether instantiated with Double or double
       return result;
    }
}

更长的答案:

通用类应表示可应用于各种特定实例化类型的通用处理的“模板逻辑”。

很好的例子是java Collections,持久性查询框架(例如JPA Criteria API),用于不同类型投资的金融计算器,甚至是具有标准服务“容器”基础结构逻辑的SOA服务模板。

在您的情况下,使用伪方法重载可能更简单(即名称略有不同的两种方法):

protected List<Double[]> getYserieRescaledList() {
    return this.Y;
}

protected List<double[]> getYserieRescaledList2() {
    return this.YCasted;
}

甚至更好,只是坚持双[]作为唯一的情况。当您将值提取到其他变量/方法参数时,编译器将根据需要透明地执行从double到Double的autobox转换。

答案 1 :(得分:1)

只需使用Double[].classdouble[].class即可。请注意,您无法将Double[]转换为double[],反之亦然,您必须手动复制它。因此,通过扩展,您也无法将List<Double[]>投射到List<double[]>编辑:虽然第二眼看来,这可能是您尝试纠正的限制。

答案 2 :(得分:1)

这里有一些有趣的东西。因此,List<double[]>List<Array>对象,其中Array包含原始double

我敢说,仿制药在这里不是正确的解决方案。

我认为您最好的选择是使用Google Lists库。

类似的东西:

protected List<Double[]> getYserieRescaledList() {
   return this.YseriesScaled;
}

然后,无论你的getYseriesRescaledList()有什么电话可以做这样的事情来获得List<double[]>

Lists.transform(getYseriesRescaledList(),toPrimitiveDouble());

这将使用下面的函数(来自Google Guava)在一行代码中构造一个List对象:

private Function<Double[], double[]> toPrimitiveDouble(){
    return new Function<Double[], double[]>() {
        @Override
        public double[] apply( Double[] doubles) {
            double[] doubleArray = new double[doubles.length];

            int i = 0;
            for (Double doubleObject : doubles){
                doubleArray[i] = doubleObject.doubleValue();
                ++i;
            }

            return doubleArray;
        }
    };
}