我的通用方法中的强制转换是否安全?

Don*_*nir 5 java generics casting type-safety

我的项目中的代码如下所示:

public interface Bar<T extends Foo<?>> {
 //...
}

public class MyFoo implements Foo<String> {
    private List<Bar<Foo<String>> barFoo = ...

    public <U extends Foo<String>> boolean addBar(Bar<? extends U> b) {
        barFoo.add((Bar<Foo<String>>) b); //safe cast?
    }

}
Run Code Online (Sandbox Code Playgroud)

Eclipse为演员提供了警告addBar,因为演员阵容不安全.但是,我是否正确假设投射不会因为我对类型参数施加的限制而抛出,因此投射确实安全?

jac*_*obm 6

不一般.

假设Bar有一个方法void get(T value),并且有两个实现Foo<String>,MyFooYourFoo.现在假设调用者调用addBar了类型的值Bar<MyFoo>.这有效:当U=时Foo<String>,我们有Bar<MyFoo>一个子类型Bar<? extends U>.现在我们将该值转换为a Bar<Foo<String>>.

现在如果Bar没有接受T's作为参数的方法,那就没问题了.但是假设它有一个方法void process(T value).我们调用的实现有T= MyFoo,所以它只有一个process(MyFoo value)方法.Bar<Foo<String>>但是,一旦我们将它转​​换为a ,我们可能会用它YourFoo来代替它.这是非法的.

在黑暗中刺伤,但我怀疑你真正想要做的是宣称barFooList<? extends Bar<? extends Foo<String>>.