为什么返回函数需要额外的转换(不兼容的类型)?

Opa*_*pal 0 java generics lambda function java-8

有一个类A可能以某种方式映射到另一个类B或其他类:

class A {}

class B {
    final A a;

    B(A a) {
        this.a = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个映射器工厂,它A根据作为参数传递的第二个类类型将映射器从另一个类返回到另一个类:

class Mapper {

    static Function<A, B> a2bmapper = B::new;

    static <R> Function<A, R> findMapper(Class<R> cls) {
        if(cls == B.class) {
            return a2bmapper;
        }
        return null;
    }        
}
Run Code Online (Sandbox Code Playgroud)

问题是在这一行:

return a2bmapper;
Run Code Online (Sandbox Code Playgroud)

java编译器问题不兼容类型:必需R,找到B和IDE建议转换为Function<A,R>.这是为什么?R只是一种通用类型,应该用B.

Swe*_*per 5

findMapper应该回到Function<A, R>哪里R可以是什么,不一定B.

我们假设我们称之为String.class.现在RString.该函数应该返回a Function<A, String>,但是你要返回一个Function<A, B>.编译器看到了这种可能性,并对你说不.

"但我检查是否RB才返回,但!" 你喊道.好吧,那个检查是在运行时完成的,编译器并不关心.

由于类型擦除,每个通用参数都只是Object在运行时.这就是为什么你可以把它Function<A, B>用来解决这个问题.