使用强制转换和 lambda 进行收集

Collecting with casts and lambdas

我 运行 遇到 java 8 中的一个问题,它不允许我在使用强制转换时收集对象。

definitions.stream()
           .map(Definition.class::cast)
           .map((Definition definition) -> { 
               WonderfulDefinition wd = new WonderfulDefinition();
               wd.name(definition.getName());
               //etc
               return wd;
           }).collect(Collectors.toList())

我收到编译器错误:

Error:(71, 23) java: incompatible types: inference variable T has incompatible bounds equality constraints: java.util.List lower bounds: java.lang.Object

如有任何帮助,我们将不胜感激。

已更新:

import java.util.*;
import java.util.stream.*;

class Driver {
    public static void main(String[] args) {
        List definitions = new ArrayList<>();
        definitions.add(new Definition());
        definitions.add(new Definition());

        List<WonderfulDefinition> list =
                definitions.stream()
                        .map(Definition.class::cast)
                        .map((Definition definition) -> {
                            WonderfulDefinition wd = new WonderfulDefinition();
                            wd.name(definition.getName());
                            //etc
                            return wd;
                        }).collect(Collectors.toList());

        System.out.println(list);
    }
}
class Definition {
    private String name;

    public String getName() {
        return name;
    }
    public void name(String name) {
        this.name = name;
    }
}
class WonderfulDefinition extends Definition {
}

问题是您的 List 未键入。在这种情况下,只需通过执行转换来提示编译器:

((List<Object>) definitions).stream()
      .map(Definition.class::cast)
      .map(definition -> {
          WonderfulDefinition wd = new WonderfulDefinition();
          wd.name(definition.getName());
          //etc
          return wd;
      }).collect(Collectors.toList());

请记住,这样的事情是完全有效的:

List definitions = Arrays.asList(new Definition());
List<Object> d = definitions;