<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b>"Liangtao" <gliangtao@gmail.com><br><b>To: </b>"compiler-dev" <compiler-dev@openjdk.org><br><b>Sent: </b>Saturday, September 16, 2023 1:23:15 AM<br><b>Subject: </b>Re: tertiary operator error casting Float to Object<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div dir="ltr"><div>Sorry for the typo (now fixed)</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Sep 15, 2023 at 4:21 PM Liangtao <<a href="mailto:gliangtao@gmail.com" target="_blank">gliangtao@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><font face="monospace">The following code always output incorrect casting result:<br></font><div><font face="monospace"><br></font></div><div><font face="monospace">// BEGIN Bug.java code<br></font></div><div><font face="monospace"><font color="#ff0000">public class Bug {<br> public static void main(String[] args) {<br> float temp = 60.0f;<br> boolean isInt = true;<br> Object o = isInt ? Integer.valueOf((int)temp) : Float.valueOf(temp);<br> System.out.println("isInt " + isInt + ", temp = " + o);<br> }<br>}</font><br></font></div><div><font face="monospace">// END Bug.java code</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Steps to reproduce:</font></div><div><font face="monospace">$ javac Bug.java && java Bug</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Actual Result:</font></div><div>
<p style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:11px;line-height:normal;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><font face="monospace">isInt true, temp = 60.0</font></span></p><p style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:11px;line-height:normal;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><font face="monospace"><br></font></span></p><p style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:11px;line-height:normal;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><font face="monospace">Expected Result:</font></span></p><p style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:11px;line-height:normal;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><font face="monospace">isInt true, temp = 60</font></span></p></div><br></div>
</blockquote></div></div></blockquote><div><br></div><div>This is a well known oddities of the Java spec, the result of ?: with an Integer and a Float is a float,</div><div>inside a ?: the wrappers behave like their primitive counterparts,<br data-mce-bogus="1"></div><div>see <a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-15.html#jls-15.25">https://docs.oracle.com/javase/specs/jls/se20/html/jls-15.html#jls-15.25</a></div><div><br data-mce-bogus="1"></div><div>So your code is equivalent to:</div><div><span style="font-family: monospace;"><span style="color: #ff0000;">float o = isInt ? Integer.valueOf((int)temp) : Float.valueOf(temp);</span></span></div><div><br data-mce-bogus="1"></div><div>If you want the wrappers to behave like objects inside a ?:, you have to cast one them as an Object.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div><span style="font-family: monospace;" data-mce-style="font-family: monospace;"><span style="color: #ff0000;" data-mce-style="color: #ff0000;">Object o = isInt ? (Object) Integer.valueOf((int)temp) : Float.valueOf(temp);</span></span></div><div><br data-mce-bogus="1"></div><div>regards,<br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div></div></div></body></html>