我不应该能够以多态方式访问该类吗...
你可以——如果你的变量的类型是 type C
。但它不是,它是 type MyInterface
,它完全定义了您可以访问的实例的哪些功能。是的,该实例具有更多功能,但写入接口的代码不知道这一点。
添加特性C
与多态性关系不大。在这种情况下,多态性(有几种不同的类型)是A
并且可以以不同的方式C
实现MyInterface
's 的功能,但是您通过引用使用实例的代码既不知道也不关心实例是s 还是s;它所知道的,它应该知道的,就是它们声称是.MyInterface
A
C
MyInterface
让我们举一个具体的例子:
public void doSomethingWith(List list) {
// ...
}
当调用doSomethingWith
时,它会传入一个满足List
接口的实例。这就是该方法所知道的关于实例的所有信息(没有像instanceof
and之类的东西getClass
)。实例可以是 an ArrayList
、 a LinkedList
、 aStack
等;但使用它的代码不知道也不关心这一点。它只知道它是一个List
. 即使该方法传递了一个ArrayList
,它也不能使用(比如说)ensureCapacity
而不首先向下转换引用(如果实例不是一个,这将失败ArrayList
),因为并非所有List
实现都有ensureCapacity
.