Possible regression involving inferred generic types

cushon cushon at google.com
Wed Oct 16 17:52:11 PDT 2013


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>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
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20131016/0b10b3fa/attachment.html 


More information about the compiler-dev mailing list