2017-03-10 2 views
0

Ich versuche, eine Instanz einer Klasse ZipIterator zu erstellen, die zwei beliebige Arrays als Argumente akzeptiert und sie über den Konstruktor den zwei privaten Feldern K [] und V [] gleichsetzt. In meiner Test-Klasse Haupt Methode main-Methode, ich istWie erstelle ich eine Instanz einer Klasse mit zwei generischen Typen?

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; 
    } 

} 

In meiner Test-Klasse zu schreiben, versuche ich ein ZipIterator Objekt wie diese

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); 

zu schaffen, aber ich halte das immer Fehler:

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

Ich bin nicht genau sicher, was ich falsch mache. Wenn jemand helfen kann, würde es sehr geschätzt werden!

+1

Sie können keine primitiven Typen mit Generika verwenden. Verwenden Sie die Wrapper-Typen 'Integer' und' Double'. – 4castle

+1

Sie haben 'K' auf' int [] 'gesetzt, und der Konstruktor erwartet ein' K [] ', was ein' int [] [] 'wäre. –

Antwort

-1

Es sollte sein ZipIterator<int,double> zip = new ZipIterator<int,double>(arr1,arr2);

+0

Dies wird nicht kompiliert. – 4castle

1

Denken Sie über die Unterzeichnung ZipIterator<K[], V[]> wenn Kint[] und V ist double[] ist.

Was Sie instanziieren müssen, ist ZipIterator<Integer, Double>; Sie können eine Klasse nicht mit einem primitiven Typ parametrisieren.

Ja, es ist ineffizient wegen Boxen/Unboxing. Wenn Sie eine höhere Leistung wünschen, erstellen Sie Wrapperklassen, die ein Array eines primitiven Typs als Instanzvariable beibehalten. Es wird jedoch schwierig sein, es schön parametrisch zu machen.

-1

Verwenden Sie die Wrapper-Klassen

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); 

Edited meine Antwort auf der Grundlage der Kommentar von @ 4castle

+0

warum abwählen? – rpfun12

1

Schauen Sie genau, was passiert:

Sie verwenden int[] als generische Typ K:

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

Ihr Konstrukt oder aber akzeptiert eine Reihe von K, so dass eine Reihe von int[] würde int[][] erfordern:

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

Hinweise:

  • Sie sollten nicht Arrays mit Generika verwenden , verwenden Sie stattdessen die List Schnittstelle:

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

    Oder wie 4castle mentioned können Sie sogar die Iterable Schnittstelle verwenden.

  • Im Gegensatz zu dem, was andere sagten, ist ein Array immer ein Objekt, auch wenn es ein Array eines primitiven Typs ist. So ist die Verwendung int[] für K perfekt gültig, während int nicht ist.

+1

In diesem Fall könnten sie wahrscheinlich auch "Iterable" anstelle von "List" verwenden – 4castle

Verwandte Themen