Compiler-Fehler Oracle javac 7 nicht kompatibel zu Sun javac 6

Ebenius

Top Contributor
Huhu,

ich bin grad ganz verwundert. Dieses Stück Java:
Java:
public class CompilerVarArgsTest {

  private static void foo(Object... args) {}

  private static void foo(int i2, Object... args) {}

  public static void main(String[] args) {
    foo(1, Integer.valueOf(0), "second arg");
  }
}
… kann ich mit dem javac aus dem Sun-JDK 6 (JLS 3) kompilieren. Mit dem javac aus dem Oracle-JDK 7 (ebenfalls gegen JLS 3!) funktioniert das aber nicht. :noe: Ist das ein bekannter Compiler-Bug oder hab ich nen Denkfehler?

Code:
me@myhost:~/devel/workspace-rsm/Playground/src$ /usr/lib/jvm/java-6-sun/bin/javac -source 1.5 -target 1.5 CompilerVarArgsTest.java 
me@myhost:~/devel/workspace-rsm/Playground/src$ /usr/lib/jvm/java-7-oracle/bin/javac -source 1.5 -target 1.5 CompilerVarArgsTest.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.5
CompilerVarArgsTest.java:8: error: reference to foo is ambiguous, both method foo(Object...) in CompilerVarArgsTest and method foo(int,Object...) in CompilerVarArgsTest match
    foo(1, Integer.valueOf(0), "second arg");
    ^
1 error
1 warning
:mad:

[EDIT]BTW: Mein JDT ist natürlich der selben Meinung wie der Sun-6-javac. :smoke:[/EDIT]
Grüße, Ebenius
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
oO welche Methode verwendet denn das JDK6?

Finde ich aber ok, dass das angeprangert wird. Könnte sonst zu unschönen/unerwarteten Seiteneffekten führen.
 

Ebenius

Top Contributor
Es verwendet die konkretere, also die zweite [c]foo()[/c]. Und das deckt sich auch mit der JLS 3 (soweit ich das in Erinnerung habe). Eine Warnung hätte ich ja auch noch verstanden. Aber einfach einen Fehler schmeißen und abbrechen, obwohl ich source-compliance 1.5 mit angebe, das ist ein No-Go!

Und nö, das Anzuprangern ist gar nicht nett. Das eigentliche Beispiel sieht so aus:
Java:
  public static int showConfirmDialog(
        Component parentComponent,
        String msg,
        int optionType,
        Object... args) {
    // ...
  }

  public static int showConfirmDialog(
        Component parentComponent,
        String msg,
        int optionType,
        int messageType,
        Object... args) {
    // ...
  }
Und dabei ist's völlig logisch, dass der Aufruf [c]showConfirmDialog(frame, "Agree, that something is wrong with {0}?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, "Oracle")[/c] auf die zweite Methode verweist.

Grundsätzlich dürfen verschiedene Compiler für die selbe Sprache einfach nicht unterschiedlicher Meinung sein, was erlaubt ist und was nicht. :(

Ebenius
 

xehpuk

Top Contributor
Dass der Code kompiliert wurde, scheint ein Bug gewesen zu sein, der mit Java 7 gefixt wurde: 7115209 : Compiler regression with ambiguous varargs methods

JLS-Referenz: 15.12.2.5. Choosing the Most Specific Method
Siehe "Changes in Most Specific Varargs Method Selection": Incompatibilities between JDK 7 and JDK 6
RFE, der dazu geführt hat: Bug ID: 6199075 Unambiguous varargs method calls flagged as ambiguous

Kurzbeschreibung:
Code:
int
ist kein Subtyp von
Code:
Object
AND
Code:
Object
ist kein Subtyp von
Code:
int
=> ambiguous
"Workaround": In der Methodensignatur
Code:
Integer
statt
Code:
int
, weil
Code:
Integer
ein Subtyp von
Code:
Object
ist.

Und warum das mit source-compliance nicht funktioniert: Keine Ahnung.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Jupp, hab ich auch inzwischen gefunden. :) Danke.

Dennoch find ich's blöd, dass der Compiler mit -source 1.5 nicht nach dem alten Prinzip verhält…

Ebenius
 
G

Gonzo17

Gast
Ich verstehe es nicht ganz, würde es aber gerne nachvollziehen. Ich hänge bei dieser Aussage von Bug ID: 7115209 Compiler regression with ambiguous varargs methods :

- Is (boolean,Object[]) more specific than (Object[]) ? No, because the boolean formal parameter cannot accept an Object.

Macht für mich irgendwie wenig Sinn. Wenn ich einen Aufruf mit zB (true, "Test", null) mache, wieso hat er ein Problem das mit der ersten Methode zu matchen?
 
M

maki

Gast
Ich verstehe es nicht ganz, würde es aber gerne nachvollziehen. Ich hänge bei dieser Aussage von Bug ID: 7115209 Compiler regression with ambiguous varargs methods :



Macht für mich irgendwie wenig Sinn. Wenn ich einen Aufruf mit zB (true, "Test", null) mache, wieso hat er ein Problem das mit der ersten Methode zu matchen?
Ich vermute mal Autoboxing kann schnell aus einem boolean ein Boolean machen und man merkt das nicht direkt, etc. pp.
 
S

Spacerat

Gast
Wenn ich einen Aufruf mit zB (true, "Test", null) mache, wieso hat er ein Problem das mit der ersten Methode zu matchen?
Wenn eine Methode "m(boolean a, Object ... args)" und eine Methode "m(Object ... args)" existiert, wüsste er nicht, welche Methode er nehmen soll, weil ein boolean immer noch in ein Boolean geboxed werden kann (Autoboxing). Der Compiler erwartet deswegen einen expliziten Cast des booleans zu boolean (also dem was es ist), Boolean oder Object. In den letzen beiden Fällen würde dann natürlich "m(Object ... args)" aufgerufen.
Ist schon länger her, da hab' ich eine dieses Problem betreffende Frage mal hier im Forum gestellt und mir wollte keiner glauben, was da abging. Ich hatte mich damals gewundert, wieso mit "m(x, y, z)" (alles doubles) bei den vorhandenen Methoden "m(Object ... args)" und "m(double x, double y, double z)" erstere statt letztere aufgerufen wird. Naja, seit Java 7 weis ich's ;).
[EDIT]Und wofür ich 'ne virtel Stunde brauch' schafft's maki in wenigen Minuten...[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Ne, der explizite Cast (zu boolean, bzw. in meinem Beispiel int) hilft Dir hier gar nicht. :)

[EDIT]Der explizite Cast zu Object würde helfen, die (falsche) Methode zu rufen.[/EDIT]

Ebenius
Oi... das ist neu. Bin mir sicher, dass es bei mir damals so ging. Und wie will man die "richtige" Methode nun aufrufen?
 

xehpuk

Top Contributor
Wenn ich das richtig verstanden habe, geht es nur mit meinem bereits genannten Workaround (Boxing types in die Signatur nehmen), wenn man beim Aufruf von den Varargs Gebrauch machen will. Ansonsten übergibt man eben explizit das Array.

Auch kurios in dem Zusammenhang:
Java:
public class AmbiguousVarargsTest {
	static void a(int a, long b) {}
	static void a(long a, int b) {}
	static void a(int... c) {}
	static void a() {a(0, 0);}
}
Hier wird die Varargs-Methode aufgerufen. Kommentiert man eine der beiden oberen Methoden aus, wird stattdessen die jeweils andere aufgerufen.
Und kommentiert man die Varargs-Methode aus, gibt es den bereits bekannten Kompilierfehler.
… da fällt mir so auf, dass das auch gut in den Quiz-Thread gepasst hätte. :)
 
Zuletzt bearbeitet:

D4rkscr43m

Bekanntes Mitglied
Also bei mir ruft er immer die spezifischste Methode auf? Oo
ich hab hier überhaupt kein Problem... mit JDK 7 und JRE 7

Ist bei mir nun irgendwas kaputt? :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Oneixee5 Oracle, wieder mal ... Allgemeine Java-Themen 12
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
K Oracle Java Lizenzänderung ab Java 17 Allgemeine Java-Themen 2
A Java JDK ohne Oracle Konto Allgemeine Java-Themen 5
F Timestamp in Oracle ohne Formatierung reinbekommen Allgemeine Java-Themen 7
M Umstieg Oracle JDK zu Open JDK Allgemeine Java-Themen 20
T Unterschied Oracle JDK 8u111 8u112 Allgemeine Java-Themen 3
E Oracle kann durch 0 teilen !?! Allgemeine Java-Themen 7
G Oracle Updatepolitik Allgemeine Java-Themen 2
J Zertifizierung von Oracle, ehemals SCJP Allgemeine Java-Themen 4
Kenan89 to_Date Oracle Allgemeine Java-Themen 14
BinaryLogic Oracle Zertifizierungen Allgemeine Java-Themen 3
G Oracle will mehrere hundert Produkte patchen Allgemeine Java-Themen 5
W JBoss,Axis2,Hibernate/JPA,Oracle - EntityManager Problem Allgemeine Java-Themen 4
D Oracle 10 Connect - JRE 5 vs 4 Allgemeine Java-Themen 9
W Javac nicht bei Installation installiert Allgemeine Java-Themen 9
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
J Compiler-Fehler Compiliert unter Eclipse aber nicht mit javac Allgemeine Java-Themen 0
H2SO3- wo benutze ich javac -help Allgemeine Java-Themen 5
L JAR verändern - JAVAC soll einfach nur kompilieren, ohne Prüfungen Allgemeine Java-Themen 16
P Javac ein wirklich nerviges Thema Allgemeine Java-Themen 10
J javac kaputt!? Allgemeine Java-Themen 4
B Test$1.class mit dem javac compiler Allgemeine Java-Themen 7
C MidLet kompilieren javac Allgemeine Java-Themen 9
M javac wird offenbar nicht gefunden Allgemeine Java-Themen 6
O Wo ist javac.exe - ich verwende eclipse Allgemeine Java-Themen 4
N import com.sun.tools.javac.Main; Allgemeine Java-Themen 1
D Probleme mit javac Allgemeine Java-Themen 14
G javac -optimize Allgemeine Java-Themen 3
H mit javac Verzeichnis kompilieren Allgemeine Java-Themen 2
P javac wird nicht nicht gefunden Allgemeine Java-Themen 33
the[V]oid Ausführen von "javac" über Runtime.exec() Allgemeine Java-Themen 4
F javac compiler Allgemeine Java-Themen 2
WMaerz Der neue JDK 6 enthält keine javac.exe, tool.jar usw. Allgemeine Java-Themen 6
L schon wieder der "javac nicht gefunden" fehler Allgemeine Java-Themen 9
M Sonderzeichen; Javac auf Lin <-> Win Allgemeine Java-Themen 11
G Batch-Datei - javac Ausgaben anzeigen Allgemeine Java-Themen 5
G "Einfangen" des Java / Javac outputs. Allgemeine Java-Themen 2
G mit javac in Console mehrere java Files compilieren Allgemeine Java-Themen 6
H javac: command not found Allgemeine Java-Themen 8
A Problem beim Aufruf von javac Allgemeine Java-Themen 7
N Compiler (javac) funktioniert nicht... Bitte hilfe! Allgemeine Java-Themen 3
G Problem mit "Javac" :idea: Allgemeine Java-Themen 3
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben