2017-03-10 109 views
0

我想創建一個類ZipIterator的實例,它將兩個任意數組作爲參數,並通過構造函數將它們設置爲等於兩個私有字段K []和V []。在我的測試類的主要方法,我在寫如何使用兩種泛型創建類的實例?

import java.util.Iterator; 

public class ZipIterator<K,V> 
{ 
    private K[] arr1; 
    private V[] arr2; 
    private int pos = 0; 

    public ZipIterator(K[] arr1, V[] arr2) { 
     this.arr1 = arr1; 
     this.arr2 = arr2; 
    } 

} 

在我的測試類的主要方法,我想創建這樣

int[] arr1 = {1,5,3,1,6}; 
double[] arr2 = {2.3,42.1,1.6,6.43}; 
ZipIterator<int[],double[]> zip = new ZipIterator<int[],double[]>(arr1,arr2); 

一個ZipIterator對象,但我不斷收到錯誤:

error: incompatible types: int[] cannot be converted to int[][] 

我不完全確定我在做什麼錯。如果有人可以幫助,將不勝感激!

+1

您不能使用基本類型與泛型。使用'Integer'和'Double'包裝類型。 – 4castle

+1

您已將'K'設置爲'int []',並且構造函數期待'K []',它將是'int [] []'。 –

回答

-1

應該 ZipIterator<int,double> zip = new ZipIterator<int,double>(arr1,arr2);

+0

這不會編譯。 – 4castle

1

想想的ZipIterator<K[], V[]>簽名時Kint[]Vdouble[]

你需要實例化的是ZipIterator<Integer, Double>;你不能用一個原始類型來參數化一個類。

是的,這是因爲拳擊/拆箱效率低下。如果您想要更高的性能,請製作將原始類型的數組作爲實例變量的包裝類。儘管如此,使它很好地參數化會很棘手。

-1

使用包裝類

Integer[] arr1 = {1,5,3,1,6}; 
Double[] arr2 = {2.3,42.1,1.6,6.43}; 
ZipIterator<Integer,Double> zip = new ZipIterator<>(arr1,arr2); 

編輯基於由@ 4castle

+0

爲什麼要投票? – rpfun12

1

看評論我的答案密切發生了什麼:

您正在使用int[]作爲通用型K

ZipIterator<int[], double[]> zip = new ZipIterator<int[],double[]>(arr1, arr2); 

您的結構或者,然而,在接受的K陣列,所以int[]陣列將需要int[][]

public ZipIterator(K[] arr1, V[] arr2) { ... } 

注:

  • ,則不應使用泛型陣列,請改爲使用List接口:

    public ZipIterator(List<K> arr1, List<V> arr2) { ... } 
    

    或者像4castle mentioned一樣,您甚至可以使用Iterable接口。

  • 與別人說的不同,數組總是一個對象,即使它是一個基本類型的數組。因此使用int[]代替K是完全有效的,而int則不是。

+1

在這種情況下,他們甚至可能使用'Iterable'而不是'List' – 4castle