我有:
public class<E extends aninterface> AClass{
public AClass(){
}
public void amethod(E element){
//something
}
}
public class B implements aninterface{
}
在通话代码中:
aninterface f = new B();
AClass<B> ac = new AClass<B>();
ac.amethod(f);
它表示f是aninterface
类型,但参数是“E”类型
如果我不能这样做,我不明白泛型的哪一点?
答案 0 :(得分:2)
因为AClass<B>.amethod()
需要B
作为参数。但是你传递的是aninterface
。
答案 1 :(得分:2)
请注意,引用 f
声明属于aninterface
类型,而不是类型B
。尽管在运行时引用f
指向类型为B
的实例,但编译器在此处仅查找引用f
的声明类型与{{1}之间的对齐B
要求。
也许你打算写这个呢?
AClass#amethod(E)
或者也许这样呢?
final aninterface f = new B();
final AClass<? super aninterface> ac = new AClass<aninterface>();
ac.amethod(f);
再次注意,final B f = new B();
final AClass<? super B> ac = new AClass<B>();
ac.amethod(f);
是B
,但不是相反:aninterface
不是aninterface
。因此,您无法向要求类型为B
的参数的方法提供类型aninterface
的引用。