Java Generics extends仍会生成未经检查的强制转换警告

Can*_*lms 0 java generics types casting unchecked

是否指定参数化泛型类型的继承关系不足以确保类型安全?例如:

public class ListCastFunction<F, T extends F> implements Function<F, T> {
    public final T apply(final F from) {
        return (T) from;
    }
}
Run Code Online (Sandbox Code Playgroud)

这仍然会生成编译器警告.如果我们知道T extends F,它真的没有检查吗?

Zir*_*con 9

你铸造FT,但因为T extends F,你是明确的向下转换.没有办法保证方法中的F给定是a T.假设我这样做,假设隐含的父子关系是:

ListCastFunction<Animal, Mammal> lcf = new ListCastFunction<>;
Mammal i = lcf.apply(new Fish());
Run Code Online (Sandbox Code Playgroud)

这会在执行时中断,因为a Fish不是a Mammal,但它适合你的代码.