LoginSignup
3
1

More than 5 years have passed since last update.

[Java10]varとジェネリクスの併用に注意

Last updated at Posted at 2018-03-22

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という要素に対して「取り込むか?取り込まないか?どういう対応方針で統一するか?」という点が難しいところだと思われますが、はてさて。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1