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