Warum kann ich solche Arrays nicht in Java übergeben?

8

Ich habe eine Funktion:

%Vor%

und ich möchte das Array {3,4,5} übergeben. Warum kann ich nicht anrufen:

%Vor%     
Mike 10.02.2012, 05:21
quelle

9 Antworten

7

Der Typ von {3,4,5} ist mehrdeutig (könnte int[] , short[] , long[] usw. sein). Probieren Sie:

%Vor%     
paislee 10.02.2012, 05:27
quelle
2

{3,4,5} gibt nicht an, um welchen Typ es sich handelt. Sie sollten wie folgt draw(new int[]{3,4,5});

aufrufen     
kosa 10.02.2012 05:25
quelle
2

Sie müssen es als draw(new int[]{3,4,5})

aufrufen

{3,4,5} ist eine Array-Initialisierungsmethode, ohne die vorangestellte new int[] macht es keinen Sinn. Sie können {3,4,5} als Parameter für eine Funktion namens int[] anzeigen, die Ihnen ein neues Array zurückgibt.

    
Navneeth G 10.02.2012 05:26
quelle
2

Weil Java nicht Matlab ist! Sie müssen ein Array erstellen / registrieren, bevor Sie es übergeben können!

    
Mikhail 10.02.2012 05:25
quelle
1

Sie können es so weitergeben: draw(new int[]{3,4,5}) .

    
Abrixas2 10.02.2012 05:26
quelle
1

Sehen Sie die anderen Ansers, warum Sie es nicht so machen können, wie Sie es versuchen.

Aber Sie könnten so etwas tun:

%Vor%     
Matthias Bruns 10.02.2012 06:07
quelle
1

Weil {3,4,5} kein Array ist. (Wenn ja, was wäre ein Array von ?)

    
David Schwartz 10.02.2012 05:25
quelle
0

Arrays werden als Referenz übergeben. Passing-by-Reference bedeutet, dass, wenn ein Array als Argument übergeben wird, sein Speicheradressort tatsächlich übergeben wird, der als "Referenz" bezeichnet wird.

  1. {3,4,5} gibt nicht an, welchen Typ Sie verwenden werden.
  2. Wenn Sie ein Array übergeben wollen, sollten Sie wie diese zeichnen (new int [] {3,4,5}); So kann die Methode wissen, dass Sie das Array verwenden werden.
Suresh 10.02.2012 05:32
quelle
0

Ich würde gerne auf einige der anderen Antworten hier antworten. Es war eine Sprachdesign-Option, diese Syntax für die Array-Erstellung nicht zu unterstützen. Aber wahrscheinlich nicht, weil dieses Konstrukt immer mehrdeutig ist. Zu sagen, dass {3,4,5} "mehrdeutig" ist oder "den Typ nicht widerspiegelt", ist eine zu starke Vereinfachung.

Es gibt das Potenzial für Mehrdeutigkeit mit Array-Initialisiererausdrücken als Kurzschreibweise für die Array-Erstellung, aber es kommt nicht von den einfachen Fällen wie {3,4,5} . Sie könnten eine Regel definieren, um einen Typ für einen Array-Initialisierer wie {x,y,z} auf die gleiche Weise eindeutig zu bestimmen, wie der Typ eines arithmetischen Ausdrucks wie x+y+z unter Verwendung von Typ-Promotion-Regeln. Also wäre {3,4,5} in diesem hypothetischen Fall in int[] oder a short[] ? Es wäre ein int[] , weil 3 , 4 und 5 Ints sind.

Selbst bei Objekten ohne Schnittstellen könnte man sagen, dass der Typ von {x,y,z,...} die spezifischste gemeinsame Oberklasse ist, der alle Array-Element-Ausdrücke zugewiesen werden können. Der kleinste gemeinsame Nenner, wenn Sie so wollen.

Aber mit Interfaces haben Sie effektiv Mehrfachvererbung, also haben Sie vielleicht mehrere Supertypen, denen alle Elemente eines Arrays zuweisbar sind, aber keiner dieser Supertypen ist zuweisbar, so dass Sie eine echte Mehrdeutigkeit haben.

>

Und der Null-Element-Fall, {} , jetzt ist das mehrdeutig.

Die Sprachdesigner konnten eine Regel mit folgendem Wortlaut bereitstellen: "Ein Array-Initialisiererausdruck selbst wird wie ein new T[]{...} für den Typ des Initialisierers behandelt". Selbst mit Schnittstellen hätten sie es bereitstellen und anheften können "... wenn der Typ eindeutig ist, sonst ist es ein Kompilierungsfehler". Aber sie taten es nicht. Vielleicht, weil sie die Zweideutigkeit nicht zulassen wollten. Vielleicht, weil die Regeln zur Typbestimmung für den Compiler oder für Entwickler zu kompliziert wären. Vielleicht, weil sie es nicht zu einfach machen wollten, eine Menge kleiner Arrays auf dem Haufen zu verteilen. Aber nicht weil {3,4,5} grundsätzlich nicht interpretierbar ist.

    
Andrew Janke 10.02.2012 09:56
quelle

Tags und Links