Compiler-Fehler varargs

mirjam

Mitglied
Bei dem folgenden Beispiel kompiliert example1 und example3, warum jedoch nicht example2?

Java:
public class Many {
 public int howMany(boolean b, boolean ... b2){
  return b2.length;
 }

 public static void main(String[] args) {
  Many m = new Many();
 
  int example1 = m.howMany(true, new boolean[2]);
 
  int example2 = m.howMany(true, {true, true});   
 
  boolean[] b = {true, true};
  int example3 = m.howMany(true, b);
 }
}
 

Robat

Top Contributor
Weil die Methode howMany(boolean, boolean[]) ein boolean Wert und ein boolean Array erwartet. {true, true} ist aber so kein Array.
Was gehen würde wäre:
Java:
m.howMany(true, new boolean[]{true, true});
 

mirjam

Mitglied
Ich hatte gedacht
Java:
 {true, true}
ist eine Abkürzung von
Java:
 new boolean[]{true, true}
. Daher ist mir nicht klar, warum Robats Lösung funktioniert und meine von example2 nicht.
 

mirjam

Mitglied
In denke mal, in meinem Beispiel könnte ich
Java:
m.howMany(true, new boolean[]{true, true});
oder
Java:
m.howMany(true, new Boolean[]{true, true});
verwenden. Beim Beispiel
Java:
m.howMany(true, {true, true});
hingegen ist nicht klar, ob der primitive Datentyp boolean oder die Wrapper-Klasse Boolean als Array übergeben werden soll. Daher sind die Typen nicht eindeutig. Bei einer Deklaration hingegen steht der Typ dabei, so dass hier die Abkürzung möglich ist.
Oder?
 

mirjam

Mitglied
Obwohl, ne, der Typ boolean steht ja
Java:
public int howMany(boolean b, boolean ... b2)
dabei. Das mit den nicht eindeutigen Typen ist mir doch ein Rätsel.
 
X

Xyz1

Gast
Natürlich hat das etwas mit Typisierung, Konstanten und Überladung zu tun. Erzähl doch nicht so einen Quatsch, wenn du es nicht besser weißt.

Der Typ wird nicht anhand von "Konstanten" bestimmt, das wäre laufzeittechnisch eine Katastrophe - zudem eine Quelle für Fehler. Ganz einfach.

Gar nicht darauf hören, am besten. Mir scheint, die lange Zeit am pc hat deinen Kopf gebraten. :D

So - und nun endlich schlafen ich darf. :)
 

mrBrown

Super-Moderator
Mitarbeiter
Irgendwie drängt sich mir der Eindruck auf, dass du überhaupt nicht verstanden hast, worum es eigentlich geht.

Ich habe absolut keine Ahnung, wie du jetzt auf Konstanten in Verbindung mit Typisierung kommst und da noch Überladen dazu mischt. Ich frage mich manchmal ernsthaft, ob du einfach aus einer großen Tabelle zufällige Begriffe aussuchst und die in zufällige Sätze aus einer zweiten Tabelle einbaust.

Warum ignorierst du eigentlich jede

Frage, die ich dir stelle?
In meinem Beispiel spielen weder Konstanten, noch Typisierung, noch Überladung irgendeine relevante Rolle.


Ganz einfache Frage: wenn das laut dir in meinem Beispiel äquivalent ist, warum kompiliert nur der erste Fall? Und wieso verhindern Typisierung, Überlassung und irgendwelche ominösen Konstanten das im zweiten Fall?
 
X

Xyz1

Gast
Was denn für ein Unsinn? Eine Erklärung, die du noch nicht kanntest, ist Unsinn? Das sagt viel über deinen Horizont aus, meiner Meinung.
Akzeptier einfach, dass jemand etwas etwas besser wissen könnte. Und mach kein Theater.
 

mrBrown

Super-Moderator
Mitarbeiter
Was denn für ein Unsinn? Eine Erklärung, die du noch nicht kanntest, ist Unsinn? Das sagt viel über deinen Horizont aus, meiner Meinung.
Akzeptier einfach, dass jemand etwas etwas besser wissen könnte. Und mach kein Theater.
Nehmen wir einfach an, du weißt es besser als ich, dann würde ich gern von deinem Wissen profitieren: Wenn das laut dir in meinem Beispiel äquivalent ist, warum kompiliert nur der erste Fall? Und wieso verhindern Typisierung, Überlassung und irgendwelche ominösen Konstanten das im zweiten Fall?
 

Viktim

Bekanntes Mitglied
final boolean[] a = {true, true};

final boolean[] b;
b = {true, true};
Also @DerWissende wenn du meinst, das die hier gleich sind ist das falsch.
Vieleicht meinst du auch was anderes, aber hier kann nur das erste funktionieren und das aus 2 Gründen:

1.) Da steht ein final. Das heißt nach der initialiserung kannst erstmal sowieso nichts mehr hinschreiben.
2.) Selbest wenn das final da nicht wäre, würde das 2te trotzdem nicht gehen, weil man {true, false} <- sowas nur bei der Initialisierung benutzen kann.

PS: Wenn du zwei andere Beispiele meintest, dann solltest du das auch kenntlich machen (dafür gibts ja die Zitierenfunktion :p)
 

mrBrown

Super-Moderator
Mitarbeiter
Weil im 2. Fall die Erstzuweisung erst später erfolgen könnte, dazwischen also noch Anweisungen stehen können. 1. Fall: Deklarierung und (direkte) Initialisierung. 2. Fall: Nur Deklarierung und i-wann später eine Erstzuweisung.
Das das so ist sieht man am Code, das ist keine Erklärung, außerdem kann das ja schlecht die Begründung sein, wäre es nur boolean würde das ja problemlos klappen, auch wenn man deine "Erklärung" ohne sie zu ändern darunter setzen könnte...
Und irgendwie hast du schon wieder deine als Begründung genannten Typisierung, Konstanten und Überladung vergessen, wie passen die denn jetzt darein?
 

Ähnliche Java Themen

Neue Themen


Oben