我想从单个方法返回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所述重载方法。
答案 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[].class
和double[].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;
}
};
}