<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> public static Number q(Number in) {</div><div> return in instanceof Long ? 1L : 1.0;</div><div> }</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 </div><div>verhasp:test verhasp$ javap -v Bug.class </div><div>Classfile /Users/verhasp/projects/test/Bug.class</div><div> Last modified 2012.07.21.; size 392 bytes</div><div> MD5 checksum 7a7a2b3ddba08525477330df16f4ca78</div><div> Compiled from "Bug.java"</div><div>public class Bug</div><div> SourceFile: "Bug.java"</div><div> minor version: 0</div><div> major version: 51</div><div> flags: ACC_PUBLIC, ACC_SUPER</div><div>Constant pool:</div><div> #1 = Methodref #5.#15 // java/lang/Object."<init>":()V</div><div> #2 = Class #16 // java/lang/Long</div><div> #3 = Methodref #17.#18 // java/lang/Double.valueOf:(D)Ljava/lang/Double;</div><div> #4 = Class #19 // Bug</div><div> #5 = Class #20 // java/lang/Object</div><div> #6 = Utf8 <init></div><div> #7 = Utf8 ()V</div><div> #8 = Utf8 Code</div><div> #9 = Utf8 LineNumberTable</div><div> #10 = Utf8 q</div><div> #11 = Utf8 (Ljava/lang/Number;)Ljava/lang/Number;</div><div> #12 = Utf8 StackMapTable</div><div> #13 = Utf8 SourceFile</div><div> #14 = Utf8 Bug.java</div><div> #15 = NameAndType #6:#7 // "<init>":()V</div><div> #16 = Utf8 java/lang/Long</div><div> #17 = Class #21 // java/lang/Double</div><div> #18 = NameAndType #22:#23 // valueOf:(D)Ljava/lang/Double;</div><div> #19 = Utf8 Bug</div><div> #20 = Utf8 java/lang/Object</div><div> #21 = Utf8 java/lang/Double</div><div> #22 = Utf8 valueOf</div><div> #23 = Utf8 (D)Ljava/lang/Double;</div><div>{</div><div> public Bug();</div><div> flags: ACC_PUBLIC</div><div> Code:</div><div> stack=1, locals=1, args_size=1</div><div> 0: aload_0 </div><div> 1: invokespecial #1 // Method java/lang/Object."<init>":()V</div><div> 4: return </div><div> LineNumberTable:</div><div> line 1: 0</div><div><br></div><div> public static java.lang.Number q(java.lang.Number);</div><div> flags: ACC_PUBLIC, ACC_STATIC</div><div> Code:</div><div> stack=2, locals=1, args_size=1</div><div> 0: aload_0 </div><div> 1: instanceof #2 // class java/lang/Long</div><div> 4: ifeq 11</div><div> 7: dconst_1 </div><div> 8: goto 12</div><div> 11: dconst_1 </div><div> 12: invokestatic #3 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;</div><div> 15: areturn </div><div> LineNumberTable:</div><div> line 3: 0</div><div> StackMapTable: number_of_entries = 2</div><div> frame_type = 11 /* same */</div><div> frame_type = 64 /* same_locals_1_stack_item */</div><div> 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 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> public static Number q(Number in) {</div><div> if( in instanceof Long )</div><div> return 1L; else return 1.0;</div><div> }</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>