Java 我的泛型方法中的此强制转换安全吗?

Java 我的泛型方法中的此强制转换安全吗?,java,generics,casting,type-safety,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(

我的项目中有如下代码:

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?
    }

}

公共界面栏这不是安全模式。Eclipse是正确的

假设您有一个扩展了
Foo
的类
MyFoo
,您传入了一个
Bar
现在
Bar
中的某个方法带有
myMethod(foox)
签名,而此时只编译了
myMethod(myfoox)
签名,因此方法查找将失败。

一般来说不是这样

假设
Bar
有一个方法
void get(T值)
,并且有两个
Foo
的实现,
MyFoo
YourFoo
。现在假设调用方调用
addBar
类型的值
Bar
。这是有效的:当
U
=
Foo
时,我们知道
Bar
Bar的一个亚型,演员阵容是不安全的,因为尽管
U
扩展了
Foo
,但
Bar
扩展了
Bar
并不一定是安全的。事实上,
Bar
只会在它们是同一事物时扩展
Bar
,即
U
Foo


直观地看,(例如)
List
应该是
List
的一个子类型,但泛型不是这样工作的<代码>列表
是<代码>列表的一个子类型您不能有一个扩展字符串的类,因为它是最终的,可以吗?这是一个很好的观点,也是如何保证字符串不可变的一部分。如果您使用MyFoo来扩展Foo,同样的逻辑也适用,我们将假设Foo不是最终的。回答得很好。谢谢@DongieAgnir您可能对
列表很满意
final Object o = Integer.valueOf(7);
final String s = (String) o;
final List<?> wildcardList = new ArrayList<Integer>(Integer.valueOf(7));
final List<String> stringList = (List<String>) wildcardList;