【问题标题】:Why Cannot call child class method from object of interface implemented in parent class为什么不能从父类中实现的接口对象调用子类方法
【发布时间】:2018-01-06 12:48:14
【问题描述】:
public interface WebDriver {
    default void get() {
        System.out.println("Opening Url");}

    void click();
    void sendKeys();
}

public class RemoteWebDriver implements WebDriver {
    @Override
    public void click() {
        System.out.println("Clicking WebElement");
    }

    @Override
    public void sendKeys() {
        System.out.println("Entering Text");
    }
}

public class ChromeDriver extends RemoteWebDriver {
    public void clear() {
        System.out.println("Clearing Text");
    }
}

public class TestClass {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get();
        driver.click();
        driver.sendKeys();
        driver.clear();
    }
}

driver.clear();在 TestClass 中给出错误。 "WebDriver 类型的 clear() 方法未定义"

提供 2 个快速修复:

  • 在 WebDriver 类型中创建方法 clear()
  • 将演员表添加到 webdriver

这个我知道

((ChromeDriver) driver).clear(); 

解决了这个问题。但是谁能更合乎逻辑地解释一下,为什么不允许调用子类方法

【问题讨论】:

  • 看看driver 的编译时类型——它只是WebDriver。当您调用driver.clear() 时,编译器只有 有该信息可以继续 - 而WebDriver 接口没有clear() 方法。您碰巧使用ChromeDriver 引用初始化了变量,但这不是编译器可以或应该在调用driver.clear() 中使用的信息的一部分。
  • 您没有提到的另一个选项是将driver 变量的类型更改为ChromeWebDriver。如果您依靠变量的值是ChromeWebDriver(看起来像您这样做),那么这是最合适的解决方法,IMO。

标签: java inheritance interface


【解决方案1】:

因为在编译时会检查父类或接口中的方法,所以如果在父接口中找不到方法会报编译错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2022-10-04
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多