为什么Java无法协调来自不同源的`?`泛型类型。

huangapple 未分类评论45阅读模式
英文:

Why java cannot reconcile the `?` generic type from different sources

问题

我有一个(据我理解)针对特定领域的单子(Monad),它充当了Either/Try的组合和用于REST终端点调用的操作。这是一个带有单一类型泛型参数的类,用于其包含的值。因为某些函数仅用于副作用而不关心返回值,我通常将它们的返回值简单地注释为MyMonadThing<?>。然而,这种模式在尝试在某些地方分叉逻辑时会引发问题。我不会展示单子类,但是这里有一个使用列表的示例,说明了问题:

  1. public static void main(String[] args) {
  2. map(Arrays.asList(1, 2, 3), t -> {
  3. return t == 2? foo() : bar();
  4. });
  5. }
  6. static <T, NewT> List<NewT> map(List<T> lst, Function<T, List<NewT>> fn) {
  7. return lst.stream().flatMap(t -> fn.apply(t).stream()).collect(Collectors.toList());
  8. }
  9. static List<?> foo() {
  10. return Arrays.asList("foo");
  11. }
  12. static List<?> bar() {
  13. return Arrays.asList("bar");
  14. }

这不会编译,因为三元运算符。出现以下错误: