gpt4 book ai didi

java - Java 中的类型推断

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:13 25 4
gpt4 key购买 nike

能否请您解释一下为什么下面的工作方式是这样的。在我看来,Java 类型系统无法推断 R 的类型

public class Test {

interface Parser<A,R>{
R parse(A a);
}

static class ResponseParser implements Parser<String,Integer>{

public Integer parse(String s) {
return Integer.parseInt(s) + 1;
}
}

interface Function<A,R>{
R with(A a);
}

public static <A,R,P extends Parser<A,R>> Function<P,R> getResult(final A res){
return new Function<P, R>() {
public R with(P parser) {
return parser.parse(res);
}
};
}

public static void main(String [] args){
Function<Parser<String,Integer>, Integer> func = getResult("1");
//this works
func.with(new ResponseParser());
// why this does not work
getResult("1").with(new ResponseParser());
}


}

最佳答案

getResult("1").with(new ResponseParser());表达式 getResult("1") 的类型无法从上下文正确推断出子表达式。根据您的意见,它应该是 Function<? extends Parser<String, Integer>, Integer> , 但是这个子表达式对 Integer 一无所知.在第一种情况下,您将结果分配给 Function<Parser<String,Integer>, Integer> , 所以 R = Integer类型可以解析,但是当你只是调用一些其他方法时,它不起作用。

您可以解决此问题,推迟推断返回类型的必要性。像这样:

interface ParserFunction<A> {
<R> R with(Parser<A, R> a);
}

public static <A> ParserFunction<A> getResult(final A res){
return new ParserFunction<A>() {
public <R> R with(Parser<A, R> parser) {
return parser.parse(res);
}
};
}

现在getResult("1").with(new ResponseParser());有效。

关于java - Java 中的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32326697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com