Possible regression involving inferred generic types

Alex Buckley alex.buckley at oracle.com
Wed Oct 16 16:52:54 PDT 2013


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