<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">A következő osztályt alkottam:<div><br></div><div><div>public class Bug{</div><div>&nbsp; &nbsp; public static Number q(Number in) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return in instanceof Long ? 1L : 1.0;</div><div>&nbsp; &nbsp; }</div><div>}</div><div><br></div><div>Ebből a következős sikerült a Java-nak fordítania:</div><div><div>verhasp:test verhasp$ javac Bug.java&nbsp;</div><div>verhasp:test verhasp$ javap -v Bug.class&nbsp;</div><div>Classfile /Users/verhasp/projects/test/Bug.class</div><div>&nbsp; Last modified 2012.07.21.; size 392 bytes</div><div>&nbsp; MD5 checksum 7a7a2b3ddba08525477330df16f4ca78</div><div>&nbsp; Compiled from "Bug.java"</div><div>public class Bug</div><div>&nbsp; SourceFile: "Bug.java"</div><div>&nbsp; minor version: 0</div><div>&nbsp; major version: 51</div><div>&nbsp; flags: ACC_PUBLIC, ACC_SUPER</div><div>Constant pool:</div><div>&nbsp; &nbsp;#1 = Methodref &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#5.#15 &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;java/lang/Object."&lt;init&gt;":()V</div><div>&nbsp; &nbsp;#2 = Class &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#16 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;java/lang/Long</div><div>&nbsp; &nbsp;#3 = Methodref &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#17.#18 &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;java/lang/Double.valueOf:(D)Ljava/lang/Double;</div><div>&nbsp; &nbsp;#4 = Class &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#19 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;Bug</div><div>&nbsp; &nbsp;#5 = Class &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#20 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;java/lang/Object</div><div>&nbsp; &nbsp;#6 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;init&gt;</div><div>&nbsp; &nbsp;#7 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ()V</div><div>&nbsp; &nbsp;#8 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Code</div><div>&nbsp; &nbsp;#9 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LineNumberTable</div><div>&nbsp; #10 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; q</div><div>&nbsp; #11 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (Ljava/lang/Number;)Ljava/lang/Number;</div><div>&nbsp; #12 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StackMapTable</div><div>&nbsp; #13 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SourceFile</div><div>&nbsp; #14 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Bug.java</div><div>&nbsp; #15 = NameAndType &nbsp; &nbsp; &nbsp; &nbsp;#6:#7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;"&lt;init&gt;":()V</div><div>&nbsp; #16 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java/lang/Long</div><div>&nbsp; #17 = Class &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#21 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;java/lang/Double</div><div>&nbsp; #18 = NameAndType &nbsp; &nbsp; &nbsp; &nbsp;#22:#23 &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;valueOf:(D)Ljava/lang/Double;</div><div>&nbsp; #19 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Bug</div><div>&nbsp; #20 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java/lang/Object</div><div>&nbsp; #21 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java/lang/Double</div><div>&nbsp; #22 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; valueOf</div><div>&nbsp; #23 = Utf8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (D)Ljava/lang/Double;</div><div>{</div><div>&nbsp; public Bug();</div><div>&nbsp; &nbsp; flags: ACC_PUBLIC</div><div>&nbsp; &nbsp; Code:</div><div>&nbsp; &nbsp; &nbsp; stack=1, locals=1, args_size=1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0: aload_0 &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: invokespecial #1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Method java/lang/Object."&lt;init&gt;":()V</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4: return &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; LineNumberTable:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; line 1: 0</div><div><br></div><div>&nbsp; public static java.lang.Number q(java.lang.Number);</div><div>&nbsp; &nbsp; flags: ACC_PUBLIC, ACC_STATIC</div><div>&nbsp; &nbsp; Code:</div><div>&nbsp; &nbsp; &nbsp; stack=2, locals=1, args_size=1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0: aload_0 &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: instanceof &nbsp; &nbsp;#2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// class java/lang/Long</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4: ifeq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;11</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7: dconst_1 &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8: goto &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;12</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 11: dconst_1 &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 12: invokestatic &nbsp;#3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Method java/lang/Double.valueOf:(D)Ljava/lang/Double;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 15: areturn &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; LineNumberTable:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; line 3: 0</div><div>&nbsp; &nbsp; &nbsp; StackMapTable: number_of_entries = 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;frame_type = 11 /* same */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;frame_type = 64 /* same_locals_1_stack_item */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stack = [ double ]</div><div><br></div><div>}</div></div><div><br></div><div><br></div><div>A biztonság kedvéért command line-ból fordítottam ezzel:</div><div><br></div><div><div>verhasp:test verhasp$ java -version</div><div>java version "1.7.0_04"</div><div>Java(TM) SE Runtime Environment (build 1.7.0_04-b21)</div><div>Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)</div></div><div><br></div><div>Ha értő szem megnézi a kódot, akkor láthatja (no meg tapasztalhatja is futtatás közben), hogy ez bizony mindig Double értéket fog visszaadni, akkor is, ha paraméter 'in' Long. Ha megfordítom a feltételt, és persze a feltételes kifejezés két felét is ezzel, illetve ha nem azt vizsgálom, hogy Long-e, hanem azt, hogy Double, akkor is mindig Double értéket akar visszaadni a javap disassembly alapján. Megpróbáltam&nbsp;1.6.0_33 verziójú Java-val is (nem az összes verziót, annyi türelmem nincs), ott is ugyanaz az eredmény.</div><div><br></div><div>Azért mielőtt bugreportot küldenék az ORACLE-nak, megkérdezném a tisztelt társaságot, hogy mit nézek itt nagyon be?</div><div><br></div><div>A workaround megvan, mert a</div><div><br></div><div><div>public class Bug{</div><div>&nbsp; &nbsp; public static Number q(Number in) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if( in instanceof Long )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return 1L; else return 1.0;</div><div>&nbsp; &nbsp; }</div><div>}</div></div><div><br></div><div>működik rendesen.</div><div><br></div><div apple-content-edited="true">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-family: Helvetica; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">--</span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">Verhás Péter</span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><a href="mailto:peter@verhas.com">peter@verhas.com</a></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">+36(30)9306805</span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">skype: verhas</span></div></div><br class="Apple-interchange-newline"></div><br class="Apple-interchange-newline"><br class="Apple-interchange-newline">
</div>
<br></div></body></html>