Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, hier ein Ausschnitt aus einer Klasse "Number":
Java:
public static void main(String[] args) {
int[] ar={1,2,3,4,5,6};
Number a=new Number(ar);
}
public Number(int[] sixtuple) {
numbers = sixtuple;
}
Wie offensichtlich ist, wird ein Obejtk der Number Klasse durch Angabe eines (6 Zahlen langen) int Arrays erzeugt.
Wenn ich den Code wie oben nutze funktioniert es, wenn also erst das Array als variable definiert wird und dann in den Konstruktor gesteckt wird.
Wenn ich allerdings direkt das Zahlenarray eingeben will
Java:
public static void main(String[] args) {
Number a=new Number({1,2,3,4,5,6});
}
public Number(int[] sixtuple) {
numbers = sixtuple;
}
gehts nicht und es kommen bezogen auf jene Zeile zig Fehlermeldungen:
Java:
Syntax error, insert "( )" to complete Expression Number.java /MinMax Tripel/src/b line 16 Java Problem
Syntax error, insert "SimpleName" to complete ClassType Number.java /MinMax Tripel/src/b line 16 Java Problem
Syntax error on token "new", @ expected after this token Number.java /MinMax Tripel/src/b line 16 Java Problem
Ich dachte immer, man kann Arrays explizit angeben?
Ich bin verwirrt.
Ich finde jetzt nichts explizites in der JLS, aber ich vermute mal ganz stark, das das nicht geht, weil eine Erzeugung, die gleichzeitig auch Werte setzt nur geht, wenn sie direkt einer Array Variablen zugewiesen wird. Ansonsten bekommt der Compiler Probleme den Typ sauber aufzulösen. Denn in der Zeile
Code:
new Number({1,2,3,4,5,6});
fehlt die Typ-Definition. Die wird nämlich dadurch nicht vorgeben.
Da greift dann die Zeile aus der JLS
Each variable initializer must be assignment-compatible (§5.2) with the array's component type, or a compile-time error occurs.
Das der Typ im Konstruktor als int-Array definiert ist, spielt keine Rolle. Den Java braucht erst den Typ des Parameters um dann den passenden Konstruktor zur Laufzeit zu finden.
An array initializer may be specified in a field declaration (§8.3, §9.3) or local variable declaration (§14.4), or as part of an array creation expression (§15.10.1), to create an array and provide some initial values.
Der passende Konstruktor wird bereits zur Compilezeit gefunden. Es spricht also aus Compilersicht eigentlich nichts dagegen, Array initializer expressions auch überall dort verwenden zu können, wo der Zieltyp schon statisch feststeht. Wurde nur halt nicht gemacht.
Den Typ könnte man sich ja prinzipiell auch holen. Aber wie @httpdigest richtig zitiert hat: Der Array Initializer ist nur an klar spezifizierten Stellen erlaubt. Und ein Parameter ist nicht dabei.
Wenn man hier also ein solches Array übergeben will, dann muss eine komplette "array creation expression" angegeben werden, also ein Ausdruck wie er in 15.10.1 festgelegt wurde.
Und @httpdigest war schneller - aber ich schicke es dennoch einmal ab
Puh, also bleibe ich besswer dabei wie ich es immer mache und definiere Sachen erst in einer neuen Variable bevor ich sie verwende.
Weil Alles Andere ja wider Erwarten mal wieder nicht geht :-(
Puh, also bleibe ich besswer dabei wie ich es immer mache und definiere Sachen erst in einer neuen Variable bevor ich sie verwende.
Weil Alles Andere ja wider Erwarten mal wieder nicht geht :-(
Du musst es nur richtig machen - Du kannst die angesprochene array creation expression verwenden. Das wäre denn ein new int[] {1, 2, 3, 4}
==> Bei der array creation expression kann man einen array initializer verwenden.
Du musst es nur richtig machen - Du kannst die angesprochene array creation expression verwenden. Das wäre denn ein new int[] {1, 2, 3, 4}
==> Bei der array creation expression kann man einen array initializer verwenden.
Bei primitiven Datentypen -> Nein, nur konkrete Werte sind möglich. Wenn Du flexibel auf verschiedene Variablen zugreifen möchtest, dann kannst Du diese in einem weiteren Array zusammenfassen. Im ursprünglichen Array speicherst Du dann die dazu gehörenden Indizes.
Wenn das Array Objektreferenzen speichert -> mglw., falls die verwendete Klasse geeignete Attribute besitzt.
Aber wie bei den Parametern eines Methodenaufrufs wird nur der Inhalt der Variablen im Array gespeichert und nicht die Variable selbst.
Du hast da also Ausdrücke, die ausgewertet werden. Die Variable wird sozusagen ausgewertet zu dem Wert. Ein Ausdruck a+b könnte auch ein Element sein - so diese Operation erlaubt ist.
Au weia, da habe ich es bei meiner Antwort wohl etwas zu 'eilig' mit dem Nachdenken gehabt. Bzw. habe ich mir bei der Frage etwas eingebildet, gelesen zuhaben, was da nicht gefragt wurde... 😕 sorry.
Abseits der technischen Umsetzung, ist das nicht ein explizites Array aus dem Eingangspost? Was der TE möchte ist eigentlich, ein Argument übergeben welches implizit als int Array interpretiert werden soll. Korrigiert mich bitte wenn ich falsch liege.
Au weia, da habe ich es bei meiner Antwort wohl etwas zu 'eilig' mit dem Nachdenken gehabt. Bzw. habe ich mir bei der Frage etwas eingebildet, gelesen zuhaben, was da nicht gefragt wurde... 😕 sorry.
Ich vermute, Du hattest an Referenzen gedacht. Es wird ja nicht die Variable sondern der Inhalt der Variable im Array abgelegt.
Wenn also nach der Erstellung des Arrays die Variable verändert wird, dann ändert sich das Array nicht. Wenn man Referenzen speichert, dann kann man die Instanz, auf die referenziert wird, natürlich verändern.
(Das Verhalten ist aber eigentlich gleich, denn auch bei einer Variable, die eine Referenz enthält, wird eine Änderung der Variable - also das Zuweisen einer neuen Referenz - nicht auf das Array übertragen.)
Abseits der technischen Umsetzung, ist das nicht ein explizites Array aus dem Eingangspost? Was der TE möchte ist eigentlich, ein Argument übergeben welches implizit als int Array interpretiert werden soll. Korrigiert mich bitte wenn ich falsch liege.
Das mit den Zahlen 1,2,3,4,5,6 war jetzt nur ein Beispiel, das ich eigentlich nutzen wollte um meine Numers Klasse zu testen.
Im laufenden Code habe ich eh eine Variable vom Typ int[6], deren Werte ichimme rmal wieder ändere und die ich zum Erzeugen eines neuen Numbers Elements übergebe.
Kurzum, es soll beides gehen, sowohl mit exoliziten Zahlen als auch Variabeln