通用方法 - "private <T> boolean (T[], T[])"

5

我对Java中的泛型非常陌生。我试图创建一个简单的方法来比较两个相同类型的数组,但我想使用一个通用的方法。下面是一个最小工作示例:

public class MWE {
  public static void main(String[] args){
    int[] test1,test2;
    test1 = new int[2];
    test2 = new int[2];
    checkArray(test1,test2);
  }

  private <T> boolean checkArray(T[] check, T[] test) {
    if(check.length != test.length)
      return false;

    for(int i=0;i<check.length;i++)
      if(check[i]!=test[i])
        return false;

    return true;
  }
}

当我尝试编译时,出现以下错误:
MWE.java:6: <T>checkArray(T[],T[]) in MWE cannot be applied to (int[],int[])
    checkArray(test1,test2);
    ^
1 error

2
请注意,您的方法声明可以简化为 private boolean checkArray(Object[] check, Object[] test) { - newacct
4个回答

5

泛型只适用于对象,对于原始数组,您需要有重载的方法。 (在其中可以切换到Integer [],Boolean []等)


4

将数组类型和变量改为Integer而不是int。同时,将checkArray方法改为静态的。

public class MWE
{
    public static void main( String[] args )
    {
        Integer[] test1 , test2;
        test1 = new Integer[ 2 ];
        test2 = new Integer[ 2 ];
        checkArray( test1 , test2 );
    }

    private static < T > boolean checkArray( T[] check , T[] test )
    {
        if ( check.length != test.length )
            return false;

        for ( int i = 0 ; i < check.length ; i++ )
            if ( check[ i ] != test[ i ] )
                return false;

        return true;
    }
}

4

尝试使用Integer[]代替int[]。

更详细的解释:

Java泛型总是与类一起使用,因此在使用这种泛型时,您需要使用每种类型的类版本。由于Java通过自动装箱将int值转换为Integer对象值,因此除了使用的类型名称外,代码中实际上不应该有任何区别。


无论好坏,它们只能与类类型一起使用。 - zostay

2
正如其他人指出的那样,泛型只适用于对象,因此从技术上讲,您可以切换到使用 Integer[]Boolean[] 等。

但是,请注意,Integer[]Boolean[] 都扩展了 Object[]。将此方法定义为泛型实际上几乎没有好处,因为 T 总是被推断为至少是 Object。例如,以下代码仍然可以编译:

Integer[] test1 = new Integer[2];
Boolean[] test2 = new Boolean[2];
checkArray(test1,test2);

调用者需要指定类型参数才能使检查工作:
this.<Integer>checkArray(test1,test2); //compile error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接