【问题标题】:Generic method - "private <T> boolean (T[], T[])"通用方法 - “private <T> boolean (T[], T[])”
【发布时间】:2012-05-14 09:44:16
【问题描述】:

我对 Java 中的泛型真的很陌生。我正在尝试创建一个简单的方法来比较两个相同类型的数组,但我想使用通用方法。我在下面附上了一个 MWE:

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

【问题讨论】:

  • 注意你的方法声明可以简化为private boolean checkArray(Object[] check, Object[] test) {

标签: java arrays generics


【解决方案1】:

尝试使用 Integer[] 而不是 int[]。

更详细:

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

【讨论】:

  • 不,好,坏,或无关紧要,它们只适用于类类型。
【解决方案2】:

泛型仅适用于对象,您必须为原始数组提供重载方法。 (其中可以切换到Integer[]、Boolean[]等)

【讨论】:

    【解决方案3】:

    将您的数组类型和变量更改为 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[]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
      

      【讨论】:

        猜你喜欢
        • 2014-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 2012-05-27
        • 1970-01-01
        相关资源
        最近更新 更多