收集演员表和lambdas

时间:2017-08-24 19:16:52

标签: java lambda casting collectors

我遇到了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())

我收到编译错误:

  

错误:(71,23)java:不兼容类型:推理变量T具有不兼容的边界       等式约束:java.util.List       下界: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 {
}

1 个答案:

答案 0 :(得分:3)

问题是您的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;