Abh*_*oor 5 java generics types
你能解释一下为什么下面的工作方式确实如此.在我看来,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());
}
}
Run Code Online (Sandbox Code Playgroud)
在表达式中,无法从上下文正确推断出子表达式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);
}
};
}
Run Code Online (Sandbox Code Playgroud)
现在getResult("1").with(new ResponseParser());可以了。
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |