Need help with error message

Alex Buckley alex.buckley at oracle.com
Mon Sep 9 10:40:20 PDT 2013


Hi Vicente,

When 'keys' is passed to getList, the method get(List<Integer>) is 
applicable by subtyping (JLS 15.12.2.2). This is because we allow an 
unchecked conversion to be performed on the type of 'keys', from List to 
List<Integer>. javac does this correctly.

Having chosen getList(List<Integer>) as the most specific method, we 
must determine its return type. Since unchecked conversion was necessary 
for the method to be applicable, the return type is the erasure of the 
method's declared return type (JLS 15.12.2.6). So, the return type of 
getList(List<Integer>) is List in your code.

The get(0) invocation thus has a return type of Object. That's not 
assignment-compatible with String, so the JDK8 error is correct.

Boaz says no error was given in JDK7, but I am skeptical of that.

Separately, if the result of getList(List<Integer>) is immediately 
assigned to a List<String> variable, then of course the get(0) 
invocation returns String and there is no error.

Alex

On 9/9/2013 7:25 AM, Vicente-Arturo Romero-Zaldivar wrote:
> Hi Boaz,
>
> Ok let's make sure we are talking about the same thing.
>
> I have this code:
>
> MyData.java
>
> import java.util.*;
>
> class MyData {
>
>          public List<String> getList(List<Integer> keys) {
>              int i = keys.get(0);
>              return null;
>          }
>
>          MyData data = new MyData();
>
>          //this is wrong, should be List<Integer>
>          List keys = new ArrayList();
>
>          String item= data.getList(keys).get(0);
> }
>
> if compiled with last tl/langtools, not lambda, here I could have used
> bold or capital letters as you did but I think it's not necessary. I got
> the following:
>
> MyData.java:15: error: incompatible types: Object cannot be converted to
> String
>      String item= data.getList(keys).get(0);
>                                         ^
> Note: MyData.java uses unchecked or unsafe operations.
> Note: Recompile with -Xlint:unchecked for details.
> 1 error
>
> the if I compile with -Xlint:unchecked**as the compiler is suggesting I get:
>
> MyData.java:15: warning: [unchecked] unchecked method invocation: method
> getList in class MyData is applied to given types
>      String item= data.getList(keys).get(0);
>                               ^
>    required: List<Integer>
>    found: List
> MyData.java:15: warning: [unchecked] unchecked conversion
>      String item= data.getList(keys).get(0);
>                                ^
>    required: List<Integer>
>    found:    List
> MyData.java:15: error: incompatible types: Object cannot be converted to
> String
>      String item= data.getList(keys).get(0);
>                                         ^
> 1 error
> 2 warnings
>
> I guess I have reproduced you test case, let me know if you consider
> that there is something missing.
>
> Thanks,
> Vicente
>
>
>
> On 09/09/13 14:55, Boaz Nahum wrote:
>> Thanks.
>> But I think You ignore my question.
>> Sure the compiler should warn on unchecked. That what it does in JDK
>> 7, but in JDK 8 it doesn't. Instead it raise an error on the
>> assignment of the result of get(0) to String.
>>
>> You also ignored the fact the splitting the code into two lines
>> eliminated the error message although the unchecked call, and
>> _*doesn't produce unchecked warning message.*_
>>
>> IMHO it is compiler bug.
>>
>>
>>
>>
>> On Mon, Sep 9, 2013 at 4:43 PM, Vicente-Arturo Romero-Zaldivar
>> <vicente.romero at oracle.com <mailto:vicente.romero at oracle.com>> wrote:
>>
>>     Hi Boaz,
>>
>>     The compiler is indicating that there are unchecked warnings in
>>     the code, if you don't solve them and go on, then you can't expect
>>     the compiler to do all the checking or figure out what the correct
>>     type should be.
>>
>>     Here the code should be:
>>
>>     List<Integer> keys = new ArrayList<>();  or:
>>
>>     List<Integer> keys = new ArrayList<Integer>()
>>
>>     also lambda repo is not up to date anymore, you should use
>>     tl/langtools instead.
>>
>>     Thanks,
>>     Vicente
>>
>>
>>     On 09/09/13 13:53, Boaz Nahum wrote:
>>>     Build lambda/lambda repo today.
>>>
>>>     The compiler error is strange
>>>
>>>     public List<String> getList(List<Integer> keys) {
>>>       return null;
>>>     }
>>>
>>>     MyData data = new MyData();
>>>
>>>     //this is wrong, should be List<Integer>
>>>     List keys = new ArrayList();
>>>
>>>     String item= data.getList(keys).get(0);
>>>
>>>     The error message is:
>>>     java: incompatible types: java.lang.Object cannot be converted to
>>>     java.lang.String
>>>
>>>     But if I split it to:
>>>     List<String> list = data.getList(keys);
>>>                String item = list.get(0);
>>>
>>>     then it compile fine.
>>>
>>>     The error message remind smells like compiler treats getList as
>>>     generic method.
>>>
>>>     Thanks
>>>     Boa
>>>
>>
>>
>


More information about the compiler-dev mailing list