2017-10-04 2 views
0

Weiß jemand, warum Eclipse in diesem Szenario einen Floating-Casting-Fehler meldet?Warum Eclipse einen Casting-Fehler von float auf double meldet

Was ist ungerade ist, auch wenn ich die Funktion deaktivieren unnötige Casting deaktivieren wird es immer noch entfernt und als Fehler gemeldet. Ist das nicht nur dumm?

enter image description here

Ich bin mit dieser Version von Eclipse: Version: Mars.2 Veröffentlichung (4.5.2) Build-ID: 20160218-0600

enter image description here

+0

Ich kann diesen Fehler mit Eclipse Oxygen.1 nicht reproduzieren. Es scheint sich um einen bereits behobenen Fehler zu handeln, der [ein Update] (https://stackoverflow.com/a/46273081/6505250) beheben würde. – howlger

+0

Kann auch nicht mit Neon reproduziert werden. – shmosel

+0

Ich habe eine Version mit Sauerstoff, die dieses Problem nicht hat. Klingt so, als müsste ich meine Mars-Installation auf einen Oxygen aktualisieren. Schätzen Sie das Feedback! – simgineer

Antwort

1

Sie mischen Boxen mit Generika und das ist eine Sache, die zwischen dem Eclipse-Compiler und Javac unterscheidet. In Ihrem speziellen Fall wurde dies wahrscheinlich in Neon behoben. Zumindest funktioniert es in Oxygen.1.

Betrachten Sie den folgenden Code, die Arbeit in Eclipse und Javac:

Float f = Float.valueOf("1.0"); 
System.out.println("f: " + f); 
double val = f; 
System.out.println("val: " + val); 

Aber in Ihrem Fall, die Sie verwenden eine Collection<T>:

Collection<Float> f = Collections.singleton(Float.valueOf("1.0")); 
System.out.println("f: " + f); 
double val = Collections.min(f); // ECJ thinks Object! 
System.out.println("val: " + val); 

Der Einsatz von Generika hier ist der Schlüssel Teil Aus Erfahrung unterscheiden sich Eclipse und Javac am meisten. Ich kann Ihnen nicht das Spezifische sagen, aber in diesem Fall ignoriert Eclipse einfach die Tatsache, dass die T der Sammlung ein primitiver Wrapper ist und nicht entpackt, sondern stattdessen mit einem Castfehler ausfällt.

TL; DR: Verwendung von Eclipse Oxygen.1 :)

Wenn Sie wirklich, nicht doubleValue() wie in verwenden:

double val = Collections.min(f).doubleValue(); 

und sorgen dafür, dass die Sammlung nicht leer ist und tut enthält nicht null s.