java中的类型推理
你能解释一下为什么下面的工作方式是这样的吗。 在我看来,java类型系统很难推断R的类型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
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);
}
};
}