我了解
extends
和 super
在泛型中的工作原理。
根据理论,当方法类似于
m(List<? super X>)
并且 X 是一个接口时,则可以通过 type X
列表和 X 实现类型的超类列表来调用该方法。
意味着
class Y implements X extends Z
,其中Z是一个类,所以我们应该能够通过List来调用,但我无法调用它。
如果我们以 Runnable
m(List<? super Runnable >)
为例,并通过其实现类的超类调用它,那么 Thread 是实现类,而实现的超类 (Thread
) 是 Object
,因此 List<Object>
可以工作。我的问题是为什么List<Z>
.
如果您希望
m
方法中列表中的元素实现 Animal
接口,则应按如下方式声明此方法:
static void m(List<? extends Animal> animals)
{
}
所以,extends而不是super。
顺便说一下,我要声明类
Mammal
已经实现了 Animal
接口,以便从 Mammal
派生的所有类都会自动实现 Animal
。