Java 两个数组之间泛型方法的区别
Java generic methods difference between two arrays
我正在尝试编写一种方法来找出两个相同长度数组的元素之间的差异,这是我到目前为止所做的:
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;
}
但它不断地 returns 给我一条消息,我写在它引用的代码行旁边
您的代码有两个问题:
Java 不支持创建通用数组。您可以通过创建 Object
数组然后进行转换来解决这个问题。
更大的问题是 java 不支持运算符重载,减法(即 -
)仅由原始类型支持。这是因为泛型 不 支持原始类型,这使得你试图自己做的事情变得不可能。
要解决这些问题,您需要做一些事情:
不要使用基元,但你可以使用盒装类型来代替(所以你可以使用 Integer
等来代替 int
)。
您需要告诉您的函数如何找到所需类型的两个对象之间的差异。您可以通过定义一个 'Subtractor' 接口来实现。
我还建议使用列表而不是数组,因为它们可以更好地处理泛型。如果需要,您可以在之后轻松地在列表和数组之间进行转换。
因此,作为解决方案的框架,我的建议如下:
定义一个用于查找差异的通用接口:
interface Subtractor<T> {
T subtract(T a, T b);
}
重写您的方法以使用列表,并将减法器作为参数:
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]);
我假设你的数组值是数字。很难提供通用的解决方案。但我想说这可能适用于您的情况:
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;
}
我正在尝试编写一种方法来找出两个相同长度数组的元素之间的差异,这是我到目前为止所做的:
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;
}
但它不断地 returns 给我一条消息,我写在它引用的代码行旁边
您的代码有两个问题:
Java 不支持创建通用数组。您可以通过创建
Object
数组然后进行转换来解决这个问题。更大的问题是 java 不支持运算符重载,减法(即
-
)仅由原始类型支持。这是因为泛型 不 支持原始类型,这使得你试图自己做的事情变得不可能。
要解决这些问题,您需要做一些事情:
不要使用基元,但你可以使用盒装类型来代替(所以你可以使用
Integer
等来代替int
)。您需要告诉您的函数如何找到所需类型的两个对象之间的差异。您可以通过定义一个 'Subtractor' 接口来实现。
我还建议使用列表而不是数组,因为它们可以更好地处理泛型。如果需要,您可以在之后轻松地在列表和数组之间进行转换。
因此,作为解决方案的框架,我的建议如下:
定义一个用于查找差异的通用接口:
interface Subtractor<T> { T subtract(T a, T b); }
重写您的方法以使用列表,并将减法器作为参数:
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]);
我假设你的数组值是数字。很难提供通用的解决方案。但我想说这可能适用于您的情况:
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;
}