Java 8 流中的转换类型
为了获得一些Java新流的经验,我一直在开发一个处理扑克牌的框架。这是我的代码的第一个版本,用于创建一个包含一手牌中每套牌数的代码(是一个):Map
Suit
enum
Map<Suit, Long> countBySuit = contents.stream() // contents is ArrayList<Card>
.collect( Collectors.groupingBy( Card::getSuit, Collectors.counting() ));
这效果很好,我很高兴。然后我重构,为“套装卡”和小丑创建单独的卡子类。所以这个方法从类移到了它的子类,因为小丑没有西装。新代码:getSuit()
Card
SuitCard
Map<Suit, Long> countBySuit = contents.stream() // contents is ArrayList<Card>
.filter( card -> card instanceof SuitCard ) // reject Jokers
.collect( Collectors.groupingBy( SuitCard::getSuit, Collectors.counting() ) );
请注意巧妙地插入过滤器,以确保所考虑的卡实际上是西装卡而不是小丑。但它不起作用!显然,该行没有意识到它所传递的对象保证是 .collect
SuitCard
在对此感到困惑了很长一段时间之后,在绝望中,我尝试插入一个函数调用,令人惊讶的是它的工作原理!map
Map<Suit, Long> countBySuit = contents.stream() // contents is ArrayList<Card>
.filter( card -> card instanceof SuitCard ) // reject Jokers
.map( card -> (SuitCard)card ) // worked to get rid of error message on next line
.collect( Collectors.groupingBy( SuitCard::getSuit, Collectors.counting() ) );
我不知道强制转换类型被认为是可执行语句。为什么会这样?为什么编译器使它变得必要?