2014-02-23 78 views
2

我正在学习Java的学校和主题是通用方法。我需要编写一个具有通用方法的应用程序,用相同的元素“填充”任何类型的数组。但它不工作...谁能帮助我:通用方法来填充数组

package pack.switchshift; 
import java.lang.reflect.Array; 

public class Filler { 

    public static void main(String [] args) { 
     int[] intArr = new int[10]; 
     String[] stringArr = new String[10]; 
     double[] doubleArr = new double[10]; 

     genFill(intArr, 0); 
     genFill(stringArr, "0"); 
     genFill(doubleArr, 0.0); 

     for (int element : intArr){ 
      System.out.print(element); 
     } 
    } 

    private static <T> void genFill(T[] arr, T element) { 
     for (int i = 0; i < arr.length; i++) { 
      arr[i] = element; 
     } 
    } 
} 

我想在这多种方法,花了几个小时研究,但我仍然没有得到它。

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method genFill(T[], T) in the type Filler is not applicable for the arguments (int[], int)
The method genFill(T[], T) in the type Filler is not applicable for the arguments (double[], double) at pack.switchshift.Filler.main(Filler.java:11)

+1

对于原始类型,您必须使用它们的盒装版本。 –

+0

在这种情况下'T'没有用;你的方法签名应该是'private static void genFill(Object [] arr,Object element)' – newacct

回答

6

泛型并不总是对基本类型的工作(我一直写的,因为你可以通过一个原始int类型T类型的参数。在这int将自动装箱为Integer)。您不能创建ArrayList<int>,类似地,您无法通过int[]或期望T[]阵列的任何其他基元类型阵列。您必须改为通过Integer[]。同样通过Double[]而不是double[]

想想这样,通用方法被编译器编译为类型擦除方法。在那个过程中,这里的类型参数T被删除到最左边的界限Object。因此,编译后您的方法等效于:

private static void genFill(Object[] arr, Object element) 

现在,你能理解你不能传递一个int[]在需要的Object[]

+0

'泛型不总是适用于基元类型'它在哪种基元类型中起作用? – Kick

+0

@NiksTyagi那么,你可以传递一个基本的int,比如'0'来输入参数'T'。它将被装箱到'Integer'。 –

+0

Thyks rohit ... – Kick

2

看看Arrays.fill及其所有变种。

+0

Arrays.fill为所有对象提供了一个通用的解决方案,加上所有基元类型的重载版本。我认为这是你想要的。 – DaoWen

2

只是不要使用原语。你可以这样做,因为T实际上意味着一些对象将被替换为T而不是T,所以你应该使用原始包装。

Integer [] intArr = new Integer [10]; 
String [] stringArr = new String[10]; 
Double [] doubleArr = new Double [10]; 
+0

我按照你的建议编辑它,现在它可以工作了......希望这也是在作业中实际要求的内容:) –