【问题标题】:Collecting with casts and lambdas使用 cast 和 lambdas 收集
【发布时间】:2017-08-24 19:16:51
【问题描述】:

我在 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 in compatible bounds 等式约束: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 {
}

【问题讨论】:

  • 什么类型包含您的初始definitions 列表?
  • 不幸的是。它来自第 3 方库,该库将定义返回为没有类型的 List。即 dictionary.getDefinitions() 只返回 List
  • List 变量有什么类型?它可能标志着那部分,因为没有其他提及列表。
  • 请用MCVE 更新您的问题,它会重现您遇到的问题。这是您的代码按原样工作的示例:ideone.com/IPoexa
  • 嗨 Radiodef,我更新了它。由于列表只是“列表”(lib 代码无法更改它)而没有类型说明符(对象或其他)它失败了。

标签: java lambda casting collectors


【解决方案1】:

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

【讨论】:

  • @CoffeeIsProgramming 我使用提供的示例对其进行了测试。工作正常
猜你喜欢
  • 2018-05-26
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2021-07-10
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多