2014-12-17 7 views
11

Ich habe das folgende Stück Codeinkompatible Typen: Inferenz Variable T hat inkompatibel Grenzen

public int solution(int X, int[] A) { 

    List<Integer> list = Arrays.asList(A); 

Aus irgendeinem Grund es wirft den folgenden Kompilierungsfehler

Solution.java:11: error: incompatible types: inference variable T has incompatible bounds List list = Arrays.asList(A); ^ equality constraints: Integer lower bounds: int[] where T is a type-variable: T extends Object declared in method asList(T...)

Ich nehme an, das eine Java-8-Funktion, aber ich bin mir nicht sicher, wie man den Fehler beheben kann

+2

Gebrauch machen kann 'Integer []' statt 'int []'. – sp00m

Antwort

22

Arrays.asList erwartet eine variable Anzahl von Object. int ist kein Object, aber int[] ist, also Arrays.asList(A) wird ein List<int[]> mit nur einem Element erstellen.

können Sie IntStream.of(A).boxed().collect(Collectors.toList()); verwenden

+1

Beachten Sie, dass der IntStream-Ansatz eine etwas andere Semantik aufweist als die Verwendung von asList; Änderungen am zugrunde liegenden Array werden nicht in der resultierenden Liste wiedergegeben. (Es gibt also eine Art von Kopie). asList (T ...) kopiert nicht. Ich weiß leider nichts darüber. – rcreswick

+0

@rcreswick Interessant, wusste das nicht. Wenn jedoch dieses Verhalten erwartet wird, dann gibt es wahrscheinlich keine Möglichkeit, dies mit einem 'int []' zu erreichen, da 'int []' nicht das Backing-Array der resultierenden 'List ' sein kann. –

+0

Ich habe versucht, einen Weg zu finden, dies zu erreichen, und ich denke, die einzige Möglichkeit besteht darin, einen neuen Listentyp zu erstellen, der die Zugriffe verwaltet, um ein Backing-Array wiederzuverwenden ein Hintergrundarray. – rcreswick

0

Es gibt keine Abkürzung ist von int [] zur Umwandlung als Arrays.asList zur Liste mit Boxen nicht umgehen und wird nur eine Liste erstellen, die nicht das, was Sie wollen, ist. Sie müssen eine Hilfsmethode erstellen.

int[] ints = {1, 2, 3}; 
List<Integer> intList = new ArrayList<Integer>(); 
for (int index = 0; index < ints.length; index++) 
{ 
    intList.add(ints[index]); 
} 
3

In Java 8 Sie

List<Integer> list = IntStream.of(a).boxed().collect(Collectors.toList()); 
Verwandte Themen