我正在尝试编写一个方法来查找两个长度相同的数组之间的差异,这是我到目前为止所做的:
public static <T extends Object> T method(T[] array,T[] array1){
T[]difference;
difference = new T[array.length]; //error :generic array creation
for(int i=0;i<array.length;i++){
difference[i]=array[i]-array1[i]; //error:bad operand types for binary operator
}
return (T)difference;
}
但它不断地向我返回一条消息,我在其引用的代码行旁边写了
答案 0 :(得分:1)
您的代码存在两个问题:
Java不支持通用数组创建。您可以通过创建Object
s的数组然后进行转换来解决此问题。
更大的问题是java不支持运算符重载,而减法(即-
)仅受原始类型支持。这是因为泛型不支持原始类型,这使得你想要做的事情本身就不可能实现。
要解决这些问题,你需要做很多事情:
不要使用基元,但您可以使用盒装类型(因此,int
代替Integer
使用interface Subtractor<T> {
T subtract(T a, T b);
}
等。
您需要告诉您的函数如何找到所需类型的两个对象之间的差异。您可以通过定义“Subtractor”界面来实现此目的。
我还建议使用列表而不是数组,因为它们可以更好地处理泛型。如果需要,您可以在之后轻松地在列表和数组之间进行转换。
所以,作为解决方案的骨架,这就是我的建议:
定义用于查找差异的通用界面:
public static <T> List<T> difference(
List<? extends T> listA, List<? extends T> listB, Subtractor<T> subtractor) {
int resultSize = Math.min(listA.size(), listB.size());
List<T> result = new ArrayList<>(resultSize);
for(int i=0; i<resultSize; ++i) {
result.add(subtractor.subtract(listA.get(i), listB.get(i)));
}
return result;
}
重写您的方法以使用列表,并将减法器作为参数:
class IntSubtractor implements Subtractor<Integer> {
@Override
Integer subtract(Integer a, Integer b) {
return Integer.valueOf(a.intValue() - b.intValue());
}
}
为您希望能够使用该方法的类型定义减法器实现:
Arrays.asList
使用您的方法。您可以使用Integer[] a = new Integer[]{5,6,7,8};
Integer[] b = new Integer[]{1,2,3,4};
Integer[] c = difference(Arrays.asList(a), Arrays.asList(b), new IntSubtractor())
.toArray(new Integer[4]);
将数组转换为列表,但不幸的是,您不能使用基元数组。
UIImageView
答案 1 :(得分:0)
我假设您的数组值是数字。很难提供一般解决方案。但我想说这可能对你的情况有用:
public static <T extends Number> Number[] method(T[] array, T[] array1){
Number[]difference = new Number[array.length];
for(int i=0; i< array.length; i++){
difference[i]= Double.valueOf(array[i].doubleValue() - array1[i].doubleValue());
}
return difference;
}