# 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