<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 11/17/2011 01:43 PM, Maurizio Cimadamore wrote:
    <blockquote cite="mid:4EC50181.6000707@oracle.com" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <title></title>
      On 15/11/11 23:23, Zhong Yu wrote:
      <blockquote
cite="mid:CACuKZqGo50b+CtjaoVWnH-HJ__Qe1+tma92bGnYUw81Fr6OU8A@mail.gmail.com"
        type="cite">
        <pre wrap="">Hi team, I don't understand the behavior of javac7 u2 b11 on the following code:

   class G&lt;N extends Number&gt; {}

   &lt;T&gt; void f1(G&lt;? extends T&gt; k){} //error. why?

   &lt;T&gt; void f2(G&lt;? super   T&gt; k){} //ok. why?

With capture conversion applied, in f1, we have upper bound T&amp;Number,
lower bound null. I don't see any problem here, even if for some T,
T&amp;Number=null. Is the combination of T&amp;Number illegal?

In f2, we have upper bound Number, lower bound T. Since it's not true
that T&lt;:Number, I don't see why this should compile.
</pre>
      </blockquote>
      The failure you are seeing is caused by the following statement in
      JLS section 5.1.10:<br>
      <br>
      "<span class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;">If<span
          class="Apple-converted-space">&nbsp;</span></span><i style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">T<sub>i</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;"><span
          class="Apple-converted-space">&nbsp;</span>is a wildcard type
        argument of the form<span class="Apple-converted-space">&nbsp;</span></span><code
        style="color: rgb(0, 0, 0); font-style: normal; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);">?
        extends</code><span class="Apple-style-span" style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
        normal; font-variant: normal; font-weight: normal;
        letter-spacing: normal; line-height: normal; orphans: 2;
        text-indent: 0px; text-transform: none; white-space: normal;
        widows: 2; word-spacing: 0px; background-color: rgb(238, 238,
        255); font-size: medium; display: inline ! important; float:
        none;"><span class="Apple-converted-space">&nbsp;</span></span><i
        style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">B<sub>i</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;">,
        then<span class="Apple-converted-space">&nbsp;</span></span><i
        style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">S<sub>i</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;"><span
          class="Apple-converted-space">&nbsp;</span>is a fresh type variable
        whose upper bound is<span class="Apple-converted-space">&nbsp;</span></span><i
        style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">glb(B<sub>i</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;">,<span
          class="Apple-converted-space">&nbsp;</span></span><i style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">U<sub>i</sub>[A<sub>1</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;"><span
          class="Apple-converted-space">&nbsp;</span>:=<span
          class="Apple-converted-space">&nbsp;</span></span><i style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">S<sub>1</sub>, ..., A<sub>n</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;"><span
          class="Apple-converted-space">&nbsp;</span>:=<span
          class="Apple-converted-space">&nbsp;</span></span><i style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">S<sub>n</sub>]</i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;">)
        and whose lower bound is the null type, where<span
          class="Apple-converted-space">&nbsp;</span></span><i style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">glb(V<sub>1</sub>,... ,V<sub>m</sub>)</i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;"><span
          class="Apple-converted-space">&nbsp;</span>is<span
          class="Apple-converted-space">&nbsp;</span></span><i style="color:
        rgb(0, 0, 0); font-family: 'Times New Roman'; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium;">V<sub>1</sub>&amp; ... &amp; V<sub>m</sub></i><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;">.
        <u>It is a compile-time error if for any two classes (not
          interfaces)<span class="Apple-converted-space">&nbsp;</span></u></span><u><i
          style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
          font-variant: normal; font-weight: normal; letter-spacing:
          normal; line-height: normal; orphans: 2; text-indent: 0px;
          text-transform: none; white-space: normal; widows: 2;
          word-spacing: 0px; background-color: rgb(238, 238, 255);
          font-size: medium;">V<sub>i</sub></i><span
          class="Apple-style-span" style="color: rgb(0, 0, 0);
          font-family: 'Times New Roman'; font-style: normal;
          font-variant: normal; font-weight: normal; letter-spacing:
          normal; line-height: normal; orphans: 2; text-indent: 0px;
          text-transform: none; white-space: normal; widows: 2;
          word-spacing: 0px; background-color: rgb(238, 238, 255);
          font-size: medium; display: inline ! important; float: none;"><span
            class="Apple-converted-space">&nbsp;</span>and<span
            class="Apple-converted-space">&nbsp;</span></span><i
          style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
          font-variant: normal; font-weight: normal; letter-spacing:
          normal; line-height: normal; orphans: 2; text-indent: 0px;
          text-transform: none; white-space: normal; widows: 2;
          word-spacing: 0px; background-color: rgb(238, 238, 255);
          font-size: medium;">V<sub>j</sub>,V<sub>i</sub><span
            class="Apple-converted-space">&nbsp;</span></i><span
          class="Apple-style-span" style="color: rgb(0, 0, 0);
          font-family: 'Times New Roman'; font-style: normal;
          font-variant: normal; font-weight: normal; letter-spacing:
          normal; line-height: normal; orphans: 2; text-indent: 0px;
          text-transform: none; white-space: normal; widows: 2;
          word-spacing: 0px; background-color: rgb(238, 238, 255);
          font-size: medium; display: inline ! important; float: none;">is

          not a subclass of<span class="Apple-converted-space">&nbsp;</span></span><i
          style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
          font-variant: normal; font-weight: normal; letter-spacing:
          normal; line-height: normal; orphans: 2; text-indent: 0px;
          text-transform: none; white-space: normal; widows: 2;
          word-spacing: 0px; background-color: rgb(238, 238, 255);
          font-size: medium;">V<sub>j</sub></i></u><span
        class="Apple-style-span" style="color: rgb(0, 0, 0);
        font-family: 'Times New Roman'; font-style: normal;
        font-variant: normal; font-weight: normal; letter-spacing:
        normal; line-height: normal; orphans: 2; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; background-color: rgb(238, 238, 255);
        font-size: medium; display: inline ! important; float: none;"><u><span
            class="Apple-converted-space">&nbsp;</span>or vice versa.</u>"<br>
        <br>
      </span>Historically, javac has always interpreted the underlined
      text very strictly - meaning that glb(T, Number) where T is a
      type-variable (whose bound is Object) does not exist, as neither T
      &lt;: Number nor Number &lt;: T. As such, the capture conversion
      for G&lt;? extends T&gt; does not exist.<br>
      <br>
      While Javac 1.6 didn't complain about that specific code, it still
      ended up in calculating an erroneous glb - which then led to bad
      programs like the following to compile without errors:<br>
      <br>
      class G&lt;N extends Number&gt; {<br>
      &nbsp;&nbsp; private N n;<br>
      &nbsp;&nbsp; G(N n) { this.n = n; }<br>
      &nbsp;&nbsp; N g() { return n; };<br>
      }<br>
      <br>
      class Test {<br>
      &nbsp;&nbsp; static &lt;T&gt; void f1(G&lt;? extends T&gt; k){ String s =
      k.g(); }<br>
      <br>
      &nbsp;&nbsp; public static void main(String[] args) {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test.f1(new G&lt;Integer&gt;(1)); //throws CCE at runtime!!!<br>
      &nbsp;&nbsp; }<br>
      }<br>
      <br>
      In JDK 7 we made these error manifests, so that the glb
      computation failure is now explicit. This way no unsound programs
      will be accepted (and, as a side-effect, we got rid of a number of
      javac crashes related to the fact that javac needed to hanlde this
      erroneous captured type).<br>
      <br>
      We will consider as to whether the above JLS paragraph needs
      rewording and, perhaps, to be loosened, in order to allow glb(T,
      Number) to yield T &amp; Number.<br>
      <br>
      Thanks<br>
      Maurizio<br>
    </blockquote>
    <br>
    but T can represent a class, so I don't see how T &amp; Number can
    be valid ?<br>
    <br>
    R&eacute;mi<br>
    <br>
  </body>
</html>