Java泛型方法两个数组之间的区别

时间:2017-05-17 10:46:05

标签: java generic-method

我正在尝试编写一个方法来查找两个长度相同的数组之间的差异,这是我到目前为止所做的:

  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;
  }   

但它不断地向我返回一条消息,我在其引用的代码行旁边写了

2 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

  1. Java不支持通用数组创建。您可以通过创建Object s的数组然后进行转换来解决此问题。

  2. 更大的问题是java不支持运算符重载,而减法(即-)仅受原始类型支持。这是因为泛型支持原始类型,这使得你想要做的事情本身就不可能实现。

  3. 要解决这些问题,你需要做很多事情:

    1. 不要使用基元,但您可以使用盒装类型(因此,int代替Integer使用interface Subtractor<T> { T subtract(T a, T b); } 等。

    2. 您需要告诉您的函数如何找到所需类型的两个对象之间的差异。您可以通过定义“Subtractor”界面来实现此目的。

    3. 我还建议使用列表而不是数组,因为它们可以更好地处理泛型。如果需要,您可以在之后轻松地在列表和数组之间进行转换。

      所以,作为解决方案的骨架,这就是我的建议:

      1. 定义用于查找差异的通用界面:

        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;
        }
        
      2. 重写您的方法以使用列表,并将减法器作为参数:

        class IntSubtractor implements Subtractor<Integer> {
            @Override
            Integer subtract(Integer a, Integer b) {
                return Integer.valueOf(a.intValue() - b.intValue());
            }
        }
        
      3. 为您希望能够使用该方法的类型定义减法器实现:

        Arrays.asList
      4. 使用您的方法。您可以使用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;
 }