Possible regression involving inferred generic types

Alex Buckley alex.buckley at oracle.com
Thu Oct 17 11:14:16 PDT 2013


Hi Jeremy,

The JDK8 release notes will include a page on compatibility akin to that 
for JDK7: 
http://www.oracle.com/technetwork/java/javase/compatibility-417013.html. 
The page will list incompatible changes in the Java language (epsilon) 
and incompatible changes in javac (epsilon * 2).

The Java Documentation Team generates these lists by looking for JBS 
issues with the label "release-note=yes". Individual engineers are 
required to be mindful about changes which affect compatibility, and add 
the label where necessary. On lambda-dev you should be able to find out 
which JBS issue owned the javac change which tightened return type 
erasure. Note there is no language change (i.e. JLS change) here, nor is 
there any inference occurring in Liam's examples (there are generic 
types, but no generic methods).

Alex

On 10/17/2013 9:00 AM, Jeremy Manson wrote:
> Hi Alex,
>
> Liam is trying to get javac8 up and running with our source base.  He
> seems to be encountering this particular issue a fair bit, which makes
> me think that this should be listed in the Official Big List of Java 8
> Incompatibilities.  Who is the right contact for that?  Joe Darcy?
>
> Jeremy
>
>
> On Wed, Oct 16, 2013 at 5:52 PM, cushon <cushon at google.com
> <mailto:cushon at google.com>> wrote:
>
>     Thanks for the explanation. I posted on lambda-dev here:
>     http://mail.openjdk.java.net/pipermail/lambda-dev/2013-October/011299.html
>
>
>     On Wed, Oct 16, 2013 at 4:52 PM, Alex Buckley
>     <alex.buckley at oracle.com <mailto:alex.buckley at oracle.com>> wrote:
>
>         The common theme is that you're passing values of raw types, so
>         an unchecked conversion is necessary for a method to be
>         applicable, so the return type of the chosen method is erased,
>         so Object appears in places where a more specific type is
>         necessary. The relevant JLS rules have not changed substantively
>         in SE 8, so to a first approximation javac is behaving
>         correctly. I would encourage you to post on lambda-dev as
>         generics in javac are dominated by Lambda at this time.
>
>         Alex
>
>
>         On 10/16/2013 4:08 PM, Liam Miller-Cushon wrote:
>
>             Hi all,
>
>             The following programs do not compile with the jdk8 javac.
>             (I tried b111 and
>             954dd199d6ff). All of the programs compile with the jdk7 javac.
>
>             ------------------------------__------------------------------__-------------------
>             import java.util.List;
>
>             class ReproOne {
>
>                 static class Baz<T> {
>                   public static List<Baz<Object>>
>             getElements(Baz<Object> transcoder) {
>                     return null;
>                   }
>                 }
>
>                 private static void bar(Baz arg) {
>                   for (Baz element : Baz.getElements(arg)) {}
>                 }
>             }
>             ------------------------------__------------------------------__-------------------
>             abstract class ReproTwo<T> {
>
>                 class Bar<E> {}
>
>                 T get(Bar<? extends T> arg1, Bar arg2) {
>                   return circularGet(arg2, arg2);
>                 }
>
>                 abstract T circularGet(final Bar<? extends T> arg1,
>             final Bar<?> arg2);
>             }
>             ------------------------------__------------------------------__-------------------
>             abstract class ReproThree<T, V> {
>
>                 class Binding<E> {}
>                 class ProviderBinding<E> extends Binding<E> {}
>
>                 abstract V visitOther(Binding<? extends T> binding);
>
>                 public V visitTwo(ProviderBinding<? extends T>
>             providerBinding) {
>                   return visitOther((Binding) providerBinding);
>                 }
>             }
>             ------------------------------__------------------------------__-------------------
>
>             javac output:
>
>             ReproOne.java:12: error: incompatible types: Object cannot
>             be converted
>             to Baz
>                   for (Baz element : Baz.getElements(arg)) {}
>                                                     ^
>
>             ReproTwo.java:6: error: incompatible types: Object cannot be
>             converted to T
>                   return circularGet(arg2, arg2);
>                                     ^
>                 where T is a type-variable:
>                   T extends Object declared in class ReproTwo
>
>             ReproThree.java:10: error: incompatible types: Object cannot be
>             converted to V
>                   return visitOther((Binding) providerBinding);
>                                    ^
>                 where V is a type-variable:
>                   V extends Object declared in class ReproThree
>
>
>


More information about the compiler-dev mailing list