2014-02-23 113 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

我按照你的建議編輯它,現在它可以工作了......希望這也是在作業中實際要求的內容:) –