【发布时间】: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