使用super for Runnable接口并定义要存储的Object类型没有得到任何编译错误,但对于下面的代码MyRunnale(i)使用MyObject存储但编译器引发编译错误:类型不匹配
请解释一下为什么会出现编译错误&为什么要到那里。
class Test
{
public static void main(String[] args) {
ArrayList<? super Runnable> a1 = new ArrayList<Object>();
// Here am not getting any CTE but for the below code
ArrayList<? super MyRunnable> a2 = new ArrayList<MyObject>();
// compile error: Type mismatch: cannot convert from ArrayList<MyObject> to
// ArrayList<? super MyRunnable>
}
}
class MyObject {
}
interface MyRunnable {
}
class MyThread extends MyObject implements MyRunnable {
}
答案 0 :(得分:0)
当您使用ArrayList<? super Runnable>
时,这意味着ArrayList可以引用Runnable
的ArryList和任何超级类型的Runnable
(在这种情况下为ArrayList<Runnable>()
或{{1 }})。
但ArrayList<Object>()
是MyObject
的子类型。因此,它不允许您为其分配Runnable
。
如果您想引用ArrayList<MyObject>()
,则应使用ArrayList<MyObject>()
。
但请确保您满足PECS规则。