【发布时间】:2015-09-01 08:14:24
【问题描述】:
您能否解释一下为什么下面的工作在某种程度上是可行的。 在我看来,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());
}
}
【问题讨论】:
-
我只是想了解为什么没有推断出“R”
-
那么下面是怎么遵守的呢? Function
, Integer> func = getResult("1"); //这工作 func.with(new ResponseParser()); -
和 getResult("1").with(new ResponseParser());甚至不编译
-
AFAIK,编译器将检查传递给 with() 的 ResponseParser 是否与 getResult() 的返回类型兼容。所以要做到这一点,它需要知道 getResult() 的返回类型。但它不能,因为您没有为 getResult() 方法调用指定任何泛型类型,并且它无法推断它们,因为返回的值没有像第一个示例中那样分配给任何变量。 Java 不会从传递给方法的参数中推断方法 getResult() 的类型,该方法调用 getResult() 的结果。
-
@RealSkeptic,他不使用原始类型。