<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Ughh, that again.  This is 15-year-old technical debt in the C2 type system.<div class="">It has almost earned VP-level recognition as an organizational cost center.</div><div class=""><br class=""></div><div class="">Here is some of the trail of tears:</div><div class=""><a href="https://bugs.openjdk.java.net/browse/JDK-6312651" class="">https://bugs.openjdk.java.net/browse/JDK-6312651</a></div><div class=""><a href="https://bugs.openjdk.java.net/browse/JDK-4641534" class="">https://bugs.openjdk.java.net/browse/JDK-4641534</a></div><div class=""><a href="https://bugs.openjdk.java.net/browse/JDK-6837094" class="">https://bugs.openjdk.java.net/browse/JDK-6837094</a></div><div class=""><a href="https://bugs.openjdk.java.net/browse/JDK-8028165?focusedCommentId=13614504&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13614504" class="">https://bugs.openjdk.java.net/browse/JDK-8028165?focusedCommentId=13614504&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13614504</a></div><div class=""><br class=""></div><div class="">There are two related confusions:  1. When the code was written, almost nobody understood that interface names in bytecode must be treated as aspirations, something that is hoped to be true but cannot be relied on.  So we coded them as if they were reliable types, and then patched forever around the spots where that assumption got us into trouble.  2. Multiply-inherited types like interfaces can be made into a lattice, but only if your lattice labels are *sets* of type names, instead of single class names.  The second point is not confusing after a few moments of thought, but we rarely got that far due to confusion #1.  Nowt, nobody wants to touch the code, except when they are forced to patch it up a little more.</div><div class=""><br class=""></div><div class="">Up-leveling a bit, here's what a type system designer has to remember, at least when working in an optimizer like C2:  A type is not only an ideal (extensional) subset of a universe of runtime values, but it is an (intension) assertion about every value that may eventually bind to the typed entity.  The extensional structure is pleasant to visualize in an ad hoc manner, and it turns into a venn-like lattice diagram, but the intensional structure is much easier to reason about, since it factors easily into discrete propositions.  TypeInt(2,5) embodies the assertions {x:int32, x>=2, x<=5} (plus a bunch of trivial corollaries).  TypeInstPtr(String) embodies assertions {x:oop, x instanceof String, x instanceof Object}, and the last is a trivial corollary of the second.  If we want to support true interface typing, we need to implement assertion sets like this {x:oop, x instanceof Serializable, x instanceof Type}.</div><div class=""><br class=""></div><div class="">All this is to say that, while I understand that fixes like the present one are needed, they amount to rest stops on the Road of Good Intentions to You Know Where.  We need a deeper fix.</div><div class=""><br class=""></div><div class="">— John</div></body></html>