Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的类型推理_Java_Generics_Types - Fatal编程技术网

java中的类型推理

java中的类型推理,java,generics,types,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.pars

你能解释一下为什么下面的工作方式是这样的吗。 在我看来,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(A);
}
静态类ResponseParser实现解析器{
公共整数解析(字符串s){
返回整数.parseInt(s)+1;
}
}
接口函数{
R与(A);
}
公共静态函数getResult(最终结果){
返回新函数(){
带有(P解析器)的公共R{
返回parser.parse(res);
}
};
}
公共静态void main(字符串[]args){
函数func=getResult(“1”);
//这很有效
具有(新ResponseParser())的函数;
//为什么这不起作用
使用(new ResponseParser())获取结果(“1”);
}
}

编译器仅使用泛型来确保您不会违反指定类型的规则。在运行时,所有泛型都转换为
对象
,但类型安全性得到了保证,因为编译器将通知您任何违反或类型安全性的情况。要实现这一点,您需要告诉编译器您正在使用什么try,这就是为什么不推断泛型


getResult(“1”)中使用java泛型检查擦除功能表达式无法从上下文正确推断
getResult(“1”)
子表达式的类型。你认为应该是
函数我只是想了解为什么没有推断出“R”,那么下面是怎么回事?函数func=getResult(“1”)//此函数与(new ResponseParser())一起工作;使用(new ResponseParser())获取结果(“1”);如果不编译EAFAIK,编译器将检查传递给with()的ResponseParser是否与getResult()的返回类型兼容。为此,它需要知道getResult()的返回类型。但是它不能,因为您没有为getResult()方法调用指定任何泛型类型,并且它不能推断它们,因为返回值没有像第一个示例中那样分配给任何变量。Java不会从一个参数中推断方法getResult()的类型,该参数传递给在getResult()的结果上调用()的方法。@realpoint,他不使用原始类型。只是想了解为什么在这种情况下它能够推断类型……实际上,希望了解它是如何推断类型的R@Abhishekkapoor,在固定代码中,不应为
getResult(“1”)
推断
R
类型。它用
推断出
,在这里它可能知道
newresponseparser()
是返回
整数的解析器。那么这是否意味着你推迟了对R的推断,因此它将由subexpression@Abhishekkapoor是的,没错。
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);
            }
        };
}