我对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
答案 0 :(得分:4)
泛型仅适用于对象,您必须为基本数组重载方法。 (您可以在其中切换到Integer [],Boolean []等等)
答案 1 :(得分:3)
尝试使用Integer []而不是int []。
更详细:
Java Generics总是使用类,因此在使用这样的泛型时,需要使用每种类型的类版本。由于Java通过自动装箱自动将int值转换为Integer对象值,因此除了所用类型的名称之外,您的代码实际上应该没有任何区别。
答案 2 :(得分: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;
}
}
答案 3 :(得分:1)
正如其他人所说,泛型只能使用对象,因此从技术上讲,您可以切换到使用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