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