2016-04-09 13 views
0

Typ-Inferenz scheint nicht für Arrays mit generischen Methoden zu funktionieren? Ich erhalte den Fehler 'Die Methode enthält (T [], T) ist nicht anwendbar für die Argumente (int [], int)'. Wie soll ich das machen?Java-Typ-Inferenz für Array-Parameter einer generischen Methode

method(new int[1], 0); //Error 

... 

public static <T> void method(T[] array, T value) { 
    //Implement 
} 
+2

Generics nicht mit primitiven Typen nicht funktioniert, es ist für Objekte nur. Versuchen Sie stattdessen mit 'new Integer [1], 0'. –

+0

Es ist auch ein Grund, warum 'Double',' Integer', 'Boolean', ... in Java erstellt wird. –

+0

Was meinst du damit, wenn du sagst, dass Primitive nicht mit generischen Typen arbeiten? Int funktioniert gut, es ist nur das Array, das Probleme verursacht – Dimpl

Antwort

1

Generics zu gehen mit primitiven Typen nicht funktioniert, nur mit Objekttypen.

Sie können tun, was Generika wie mit mit primitiven Typen sehen, aufgrund Auto-Box:

<T> void methodOne(T value) {} 

methodOne(1); // Compiles OK, T = Integer. 

Was passiert hier eigentlich ist, dass die int wörtlichen 1 „boxed“ zu Integer.valueOf(1) wird, das ist, ein Objekt vom Typ Integer.

Sie können auch eine int[] an eine generische Methode übergeben, weil int[] ein Objekttyp selbst ist. Also:

methodOne(new int[1]); // Compiles OK, T = int[]. 

Sie können jedoch nicht, diese beiden mit dem gleichen Typ Variable mischen: int[] und Integer sind nicht verwandte Arten, so gibt es keine einzelne Variable vom Typ T, die von beiden Parameter erfüllt ist. Es gibt keinen gleichwertigen Auto-Box-Operator von int[] bis Integer[].

Als solche würden Sie brauchen eine Integer[] Array als ersten Parameter zu übergeben:

method(new Integer[1], 0); 
1

Sie könnten Integer anstelle von int verwenden, da Generika nicht mit primitiven Typen arbeiten.

0

warum verwenden Sie primitive hier eingeben. Generika arbeiten nur mit referenced Typ.

method(new int[1], 0); //Error 

besser mit

method(new Integer[]{1,2,3,4}, 0); //works fine