我正在尝试编写一个方法来找出两个相同长度数组的元素之间的差异,这是我迄今为止所做的:
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;
}
但它不断地向我返回一条消息,该消息是我在它所引用的代码行旁边写的
您的代码有两个问题:
Java 不支持通用数组创建。您可以通过创建一个Object
s数组然后进行转换来解决这个问题。
更大的问题是 java 不支持运算符重载,并且减法(即-
)仅由原始类型支持。这是由泛型不支持原始类型这一事实造成的,这使得您自己尝试做的事情变得不可能。
要解决这些问题,您需要做一些事情:
不要使用原语,但你可以使用盒装类型,而不是(所以不是int
你会使用Integer
,等等)。
您需要告诉您的函数如何找到所需类型的两个对象之间的差异。您可以通过定义“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]);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句