List list = new ArrayList();
Stream<Object> stream = list.stream();
// маппинг так для примера
List<String> collect = stream.map(obj -> obj.toString())
.collect(toList());
我在泛型中缺少什么?这种构造是有效的,但是从流Stream stream = list.stream();中删除泛型不再有效?
或者说,为什么要这样选角?(List<Object>) list
List<String> collect = ((List<Object>) list).stream.map(obj -> obj.toString())
.collect(toList());
如果您使用原始类型
Stream stream,那么泛型在所有方法中都会消失,特别是Stream该方法collect开始简单地返回Object。当然,如果需要,您可以将方法执行的结果collect带到List<String>:与列表转换类似
List<Object>:最后一个Stream将被参数化,或者它会变成具有相同问题的原始类型。这里给出了答案,但由于这是俄语的 StackOverflow,我将给出翻译:
stream(),map()和collect()所有其他流方法都基于泛型。如果省略它们的使用,那么库中所有相关的泛型也将被省略,所有结构都将变成普通接口而不指定类型。例如,如果您使用List<String>,则调用该方法stream()将得到Stream<String>。但是,如果您
stream()在List没有指定类型的情况下调用具有类型的对象,则会返回该对象Stream。本例中的方法
map()具有以下声明:但是如果我们考虑到没有指定类型的事实,它将被转换为以下形式:
因此,它将
map()返回一个对象作为结果Stream。这也将阻止功能正常工作collect(),其形式为:会变成:
因此,声明丢失
List,List<String>因此。这就是导致编译错误的原因。结果,您可以将此对象转换为所需的形式,但是,这种转换会导致警告
unchecked casts,因为编译器不知道您是否正确地转换了类型。