我无法以多态方式访问具体类的方法

时间:2017-09-02 08:17:07

标签: java interface polymorphism abstract concrete

我有一个界面 MyInterface ,有两种方法 doSomething ()和 doSomethingElse ()。

我有一个实现此接口的抽象公共类 A 。 我有一个 C 类扩展了类 A ,因此也实现了接口的方法。 在main方法中,我将类C的对象分配给MyInterface引用,如: MyInterface myiface = new C();

问题在于,如果我在任一类(抽象或具体)中添加一些方法,我就无法通过引用myiface调用该方法。我必须先把它贬低。 我不应该能够以多态方式访问该类,因为它显示在 Java SE8 for Deitel 程序员(第10章多态性和接口)一书中?

2 个答案:

答案 0 :(得分:1)

  

我不应该以多态方式访问该类...

您可以 - 如果您的变量类型属于C类型。但它不是,它是类型MyInterface,并且完全定义了您可以访问的实例的哪些功能。是的,实例具有更多功能,但写入接口的代码不知道。

C添加功能与多态无关。在这种情况下,多态性(有几种不同的类型)是AC可以用不同的方式实现MyInteface的功能 ,但是通过MyInterface引用使用实例的代码既不知道也不关心实例是A s还是C s;所有它知道,知道的一切,是他们声称是MyInterface的忠实实现。

我们举一个具体的例子:

public void doSomethingWith(List list) {
    // ...
}

当某些内容调用doSomethingWith时,它会传入一个满足List接口的实例。该方法知道该实例 all (缺少instanceofgetClass之类的内容)。该实例可以是ArrayListLinkedListStack等;但使用它的代码不知道或不关心它。它只知道它是List。即使该方法传递了ArrayList,它也不能使用(比方说)ensureCapacity而不首先向下转换引用(如果实例不是ArrayList则会失败),因为并非所有List实施都有ensureCapacity

答案 1 :(得分:0)

想想这样......假设你的MyInterface被命名为'Animal',你有两个实现它的类,名为'Dog'和'Cow'。只是因为它们都是动物你不会指望狗突然给牛奶,对吗?在这个比喻中,giveMilk()是一个只由Cow类实现的方法。

你知道了吗?