【发布时间】:2017-04-27 05:59:39
【问题描述】:
有一个类 A 可能会以某种方式映射到另一个类 B 或其他类:
class A {}
class B {
final A a;
B(A a) {
this.a = a;
}
}
还有一个映射器工厂,它根据作为参数传递的第二个类类型将映射器从 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;
}
}
问题在于这一行:
return a2bmapper;
java 编译器问题类型不兼容:Required R、Found B 和 IDE 建议转换为 Function<A,R>。这是为什么? R 只是一个泛型类型,应该替换为B。
【问题讨论】:
-
简短的回答是类型系统可以检查很多,但不能检查所有内容。限制(理论和实践,就语言规范和编译器投入的时间和精力而言)开始发挥作用。在这种情况下,Java 不会进行传递计算,因为 cls == B.class, R == B.
标签: java function generics lambda java-8