<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <br>
    <br>
    <blockquote type="cite" cite="mid:CANSoFxuCyvJP=ShamK_ept-bDJBHZ=oaKnYeNxv5ko2yTFRsyw@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_quote">
          <div><br>
          </div>
          <div>Yes I think we're saying the same thing - passing 'this'
            to any "alien" code is a leak.</div>
          <div><br>
          </div>
          <div>I'm just pointing out that the damage doesn't actually
            occur until if/when the 'this' is actually used to access
            state in a subclass. But that's just a technical point and
            doesn't ultimately change the kinds of expressions we have
            to watch out for.</div>
        </div>
      </div>
    </blockquote>
    <br>
    This is similar to the story with heap pollution; the damage of
    putting an `Integer` into a `List<String>` doesn't happen
    until you try to take it out.  We warn at the points where pollution
    *might* happen.  <br>
    <br>
    <blockquote type="cite" cite="mid:CANSoFxuCyvJP=ShamK_ept-bDJBHZ=oaKnYeNxv5ko2yTFRsyw@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_quote">
          <div>Declared outside the compilation unit of MyClass<br>
          </div>
          <div><br>
          </div>
          <div>Agreed... that formulation is simpler. But of course it
            would need a caveat for subclasses within the same
            compilation unit, e.g.:</div>
          <div style="margin-left:40px"><span style="font-family:monospace"><br>
            </span></div>
          <div style="margin-left:40px"><span style="font-family:monospace">public class Example {<br>
              <br>
                  public static abstract class A {<br>
              <br>
                      public A() {<br>
                          System.out.println(this.foo());<br>
                      }<br>
              <br>
                      public abstract int foo();<br>
                  }<br>
              <br>
                  public static class B extends A {<br>
              <br>
                      private final int x;<br>
              <br>
                      public B(int x) {<br>
                          this.x = x;<br>
                      }<br>
              <br>
                      public int foo() {<br>
                          return this.x;<br>
                      }<br>
                  }<br>
              <br>
                  public static void main(String[] args) {<br>
                      new B(123);     // prints "0"<br>
                  }<br>
              }</span><br>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    All these classes are in the same compilation unit, though it's
    possible you may not want to get fancy enough with the analysis to
    simulate virtual dispatch (though you could, since its all in the
    same file.)  <br>
    <br>
  </body>
</html>