Local Variable Type Inference - prototype

Stuart Marks stuart.marks at oracle.com
Thu Mar 10 21:56:43 UTC 2016


Hi Maurizio,

Nice work! I gave this a spin using the new JEP 269 Convenience Collection 
Factories. [3] The following examples transliterated from the old "collection 
literals" proposal [4] worked quite nicely:

     // List<Integer>
     var piDigits = List.of(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9);

     // Set<Integer>
     var primes = Set.of(2, 7, 31, 127, 8191, 131071, 524287);

     // Map<Integer, String>
     static var platonicSolids = Map.of(
         4,   "tetrahedron",
         6,   "cube",
         8,   "octahedron",
         12,  "dodecahedron",
         20,  "icosahedron");

     // List<List<Integer>>
     var pascalsTriangle =
         List.of(List.of(1),
                 List.of(1, 1),
                 List.of(1, 2, 1),
                 List.of(1, 3, 3, 1),
                 List.of(1, 4, 6, 4, 1));

The following example, however, failed:

     // List<Number>
     var numbers = List.of(2, 2.718281828);

     error: cannot infer type for local variable numbers
     var numbers = List.of(2, 2.718281828);
     (inferred type is non denotable)

The old Coin proposal suggested that this was an edge case that would require a 
type witness. Rephrasing that example in terms of the collections factories, it 
would be

     List<Number> numbers = List.<Number>of(2, 2.718281828);

However, type inference had improved enough already by JDK 8 that this works:

     List<Number> numbers = List.of(2, 2.718281828);

But trying to push this to

     var numbers = List.of(2, 2.718281828);

doesn't work. This is a rather special case. The "obvious" choice is 
List<Number>, but as Brian mentioned in his "Reader Mailbag" message [5, Q#10], 
that the inferred type is actually likely to be much more complicated, hence the 
"non denotable" message. In this case requiring an explicit type is probably 
warranted anyway.

So... ship it! :-)

s'marks

[3] http://openjdk.java.net/jeps/269

[4] http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001193.html

[5] 
http://mail.openjdk.java.net/pipermail/platform-jep-discuss/2016-March/000039.html


On 3/10/16 6:48 AM, Maurizio Cimadamore wrote:
> Hi,
> I've pushed the first iteration of the local variable type inference prototype
> in the sandbox repository[1]. For those willing and brave enough to experiment,
> the branch name is "JEP-286-branch". We are also working to get some ready-made
> binary snapshots out of the door and hope to have an update on that soon.
>
> This first iteration supports the 'var-only' syntax style:
>
> var s = "Hello!";
>
> That is, the type of 's' is inferred from the initializer, and no special
> assumption is made about mutability.
>
> Please share your experience with the prototype. For comments on this feature
> please refer to the survey[2] that Brian posted few days ago.
>
> Maurizio
>
> [1] - http://cr.openjdk.java.net/~chegar/docs/sandbox.html
> [2] -
> http://mail.openjdk.java.net/pipermail/platform-jep-discuss/2016-March/000037.html


More information about the platform-jep-discuss mailing list