当我读到《Effective Java》的第27条时,UnaryFunction<Object>
和UnaryFunction<T>
之间的类型转换让我感到困惑。
interface UnaryFunction<T> {
T apply(T t);
}
public class Main {
private static final UnaryFunction<Object> IDENTITY = new UnaryFunction<Object>() {
public Object apply(Object t) {
return t;
}
};
@SuppressWarnings("unchecked")
public static <T> UnaryFunction<T> identityFunction() {
return (UnaryFunction<T>) IDENTITY;
}
public static void main(String ... args) {
UnaryFunction<A> identityA = Main.identityFunction();
A a = identityA.apply(new A());
}
}
class A {}
为什么UnaryFunction<Object>
可以转换为UnaryFunction<T>
?
我知道泛型类型在编译后会被擦除。因此,(UnaryFunction<T>) IDENTITY
最终将变成(UnaryFunction<Object>) IDENTITY
,这将在运行时起作用。
但是,直接将UnaryFunction<Object>
转换为UnaryFunction<A>
是不被编译器允许的。
UnaryFunction<A> identityA = (UnaryFunction<A>)IDENTITY;
//incompatible types: UnaryFunction<java.lang.Object> cannot be converted to UnaryFunction<A>
UnaryFunction<Object>
和UnaryFunction<T>
之间不存在继承关系。那么为什么UnaryFunction<Object>
可以被转换为UnaryFunction<T>
?
T
可以是Object
。A
绝对不是。 - user2357112A
不是Object
,因此UnaryFunction<Object>
不能成为UnaryFunction<A>
。T
实际上可以是Object
。 - user2357112T extends Integer
,那么T
肯定不是Object
,编译器就会拒绝该转换。 - user2357112