Possible regression involving inferred generic types

Jeremy Manson jeremymanson at google.com
Thu Oct 17 09:00:49 PDT 2013


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> 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>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/20131017/64ad42f6/attachment.html 


More information about the compiler-dev mailing list