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;