Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java无法协调来自不同来源的`?`泛型类型_Java_Generics - Fatal编程技术网

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

为什么java无法协调来自不同来源的`?`泛型类型,java,generics,Java,Generics,我有一个(据我所知)为特定域准备的monad,它作为rest端点调用的/Try和action的组合。它是一个类,其包含的值只有一个类型泛型参数。因为有些函数只针对副作用编写,不关心返回值,所以我通常将它们的返回注释为MyMonadThing。然而,当我在某些地方尝试分叉逻辑时,这种模式给了我一个问题。我不会显示monad类,但下面是一个使用列表的示例,说明了这个问题 public static void main(String[] args) { map(Arrays.asList(1,

我有一个(据我所知)为特定域准备的monad,它作为rest端点调用的/Try和action的组合。它是一个类,其包含的值只有一个类型泛型参数。因为有些函数只针对副作用编写,不关心返回值,所以我通常将它们的返回注释为
MyMonadThing
。然而,当我在某些地方尝试分叉逻辑时,这种模式给了我一个问题。我不会显示monad类,但下面是一个使用列表的示例,说明了这个问题

public static void main(String[] args) {
    map(Arrays.asList(1, 2, 3), t -> {
        return t == 2? foo() : bar();
    });
}

static <T, NewT> List<NewT> map(List<T> lst, Function<T, List<NewT>> fn) {
    return lst.stream().flatMap(t -> fn.apply(t).stream()).collect(Collectors.toList());
}

static List<?> foo() {
    return Arrays.asList("foo");
}

static List<?> bar() {
    return Arrays.asList("bar");
}
publicstaticvoidmain(字符串[]args){
map(Arrays.asList(1,2,3),t->{
返回t==2?foo():bar();
});
}
静态列表映射(列表lst,功能fn){
返回lst.stream().flatMap(t->fn.apply(t.stream()).collect(Collectors.toList());
}
静态列表foo(){
返回数组。asList(“foo”);
}
静态列表栏(){
返回数组。asList(“bar”);
}
由于三元结构,无法编译此文件

- Type mismatch: cannot convert from List<capture#2-of ?> to 
 List<Object>
-类型不匹配:无法从列表转换为
列表

我可以通过强制转换(即
return(List)(t==2?foo():bar();
)来解决这个问题,但这很奇怪。假设java允许它运行,main中的结果只是类型
List
——在什么情况下,由于类型系统不健全,会导致实际错误?

三元必须返回两个分支共有的类型。由于对
一无所知,所以常见的类型是
对象
。因此Java尝试
List
,但是
List
不是
List
,因此它不起作用。它可以是一个猫的列表,不支持添加狗,但是
list
允许这样做。Java中的泛型是不变的,而不是协变的。参见
条件?“hello”:5
返回
对象
,因为这是
字符串
整数
(自动框)唯一的共同类型。@Zabuzard但奇怪的是,如果
返回t==2,它会工作吗?foo():bar()
被打包到自己的方法中,并以
List
作为返回类型。因为返回类型是
List
,而不是
List
。如果您将方法的返回类型更改为
List
,您会遇到同样的问题。@Zabuzard
,因为您对它一无所知?常见的类型是对象。那么Java尝试列表
为什么Java必须立即做出决定?为什么它不能将其作为列表进一步传播呢?您必须向Java语言设计人员询问这一点-这就是语言的工作方式。三元必须返回两个分支共有的类型。由于对
一无所知,所以常见的类型是
对象
。因此Java尝试
List
,但是
List
不是
List
,因此它不起作用。它可以是一个猫的列表,不支持添加狗,但是
list
允许这样做。Java中的泛型是不变的,而不是协变的。参见
条件?“hello”:5
返回
对象
,因为这是
字符串
整数
(自动框)唯一的共同类型。@Zabuzard但奇怪的是,如果
返回t==2,它会工作吗?foo():bar()
被打包到自己的方法中,并以
List
作为返回类型。因为返回类型是
List
,而不是
List
。如果您将方法的返回类型更改为
List
,您会遇到同样的问题。@Zabuzard
,因为您对它一无所知?常见的类型是对象。那么Java尝试列表
为什么Java必须立即做出决定?为什么它不能以列表的形式进一步传播呢?您必须向Java语言设计人员询问这一点-这就是语言的工作原理。