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