gpt4 book ai didi

java - 为什么 UnaryFunction 可以转换为 UnaryFunction
转载 作者:搜寻专家 更新时间:2023-10-31 20:09:23 28 4
gpt4 key购买 nike

当我阅读Effective Java item 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> ?

最佳答案

由于类型删除,所有没有边界( ... extends ... )的泛型都被视为 Object。因此,此转换可能对 T 的某些值有效。 @SuppressWarnings("unchecked") 告诉编译器您做的是正确的这样警告就被抑制了。

转换为特定类型是有问题的。假设您正在处理 List<Object>你把它转换到 List<A>其中 A是一个类。在这种情况下,列表可能包含属于 A 的父类(super class)型的元素。所以这个转换是不合理的,因此编译器不允许它。在函数 ( UnaryFunction<Object> ) 的情况下,暗示它可以返回一个对象。假设您的代码是 IDENTITY = t -> new Object();在这种情况下转换为 UnaryFunction<A>返回一个 Object 是不合理的.在这种情况下是 UnaryFunction<T>有一些类型 T满足类型转换,即当T是一个 Object .

有关这方面的一些背景阅读,请参阅:Liskov substitution principle它处理函数的子类型。

关于java - 为什么 UnaryFunction<Object> 可以转换为 UnaryFunction<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39423363/

28 4 0