0.はじめに
Java10で導入されたvar。
便利ではありますが、場合によってはハマる可能性もあり。
サンプルコード
var list = Set.of(BigDecimal.ZERO, BigDecimal.ONE);
// このCollectorの型は?
var toList = Collectors.toList();
var list2 = list.stream().collect(toList);
// list2の型は何でしょう? 正解:list<Object>
System.out.println(list2.get(0));
1.なぜこうなってしまう?
下記の条件を全て満たす場合、型が確定できないためにObject型になってしまいます。
①引数がない、または引数によって総称型の型が確定しない
②型引数を指定していない
2.ではどうする?
もっとも、回避自体は難しくないもので、検知が難しいわけではありません。
・型引数を指定する
・従来通り、varを使わないようにする
サンプルコード1(型引数を指定する)
var list = Set.of(BigDecimal.ZERO, BigDecimal.ONE);
// このCollectorの型は?
var toList = Collectors.<BigDecimal>toList();
var list2 = list.stream().collect(toList);
// list2の型は何でしょう? 正解:list<BigDecimal>
System.out.println(list2.get(0));
サンプルコード2(従来通り、varを使わないようにする)
var list = Set.of(BigDecimal.ZERO, BigDecimal.ONE);
Collector<BigDecimal, ?, List<BigDecimal>> toList = Collectors.toList();
var list2 = list.stream().collect(toList);
// itemの型は何でしょう?
System.out.println(list2.get(0));
ただし、このケースは「単にどう回避する?」という点ではなく
新しいvarという要素に対して「取り込むか?取り込まないか?どういう対応方針で統一するか?」という点が難しいところだと思われますが、はてさて。