Misleading error message when using diamond operator with private constructor

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Aug 22 03:19:30 PDT 2013


On 22/08/13 11:09, Maurizio Cimadamore wrote:
> On 21/08/13 19:32, Eddie Aftandilian wrote:
>> Hi compiler-dev,
>>
>> I work with Jeremy on javac at Google.  A user pointed out to us that
>> compiling code that uses the diamond operator and attempts to access 
>> a private constructor fails with a misleading error message:
>>
>> Test.java:3: error: cannot infer type arguments for MyList<>
>>     MyList<Object> foo = new MyList<>();
>>                          ^
>> 1 error
>>
>> The error is not that the types cannot be inferred, but that the 
>> constructor for MyList is private.  If you explicitly specify the 
>> type parameter in the call to the MyList constructor, you get the 
>> correct error message telling you that the constructor is private.
> Thanks for the report - it's true that error messages in diamond are 
> suboptimal when the failure occurs for reasons other than inference.
> I'll file a bug on this one.
Filed bug no. 8023545

Thanks again
Maurizio
>
> Maurizio
>>
>> Steps to reproduce:
>>
>> I'm using javac version 1.7.0_25.
>>
>> 1) Create these 2 files.
>>
>> MyList.java:
>> public class MyList<E> {
>>   private MyList() { }
>> }
>>
>> Test.java:
>> public class Test {
>>   public void foo() {
>>     MyList<Object> foo = new MyList<>();
>>   }
>> }
>>
>> 2) Compile.
>>
>> $ javac Test.java
>> Test.java:3: error: cannot infer type arguments for MyList<>
>>     MyList<Object> foo = new MyList<>();
>>                          ^
>> 1 error
>>
>> It would be great if javac produced a more helpful error message in 
>> this case.
>>
>> Thanks,
>> Eddie
>



More information about the compiler-dev mailing list