在java中输入推断

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)

Tag*_*eev 4

在表达式中,无法从上下文正确推断出子表达式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());可以了。