为何无法通过父类实现的接口对象调用子类方法?
为什么无法调用子类的
clear()方法? 先来看你提供的代码:
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(); // 这里报错:The method clear() is undefined for the type WebDriver } }
核心原因:Java的引用类型限制
你可以把WebDriver driver = new ChromeDriver();这句话类比成:
- 实际创建的对象是
ChromeDriver(相当于“本人”,拥有ChromeDriver的所有能力:继承来的click()、sendKeys()、get(),还有自己独有的clear()) - 但你给这个对象套了一张
WebDriver类型的“名片”(也就是引用类型是WebDriver)
Java编译器在检查代码时,只会认这张“名片”上标注的方法——WebDriver接口里只定义了get()、click()、sendKeys(),完全没提clear(),所以它会判定这个driver引用没有clear()方法,直接抛出错误。
简单总结:引用类型决定了编译器能“看到”哪些方法,实际对象类型决定了运行时真正执行哪个方法。这里clear()是ChromeDriver独有的,WebDriver类型的引用“看不到”这个方法。
两种修复方案的逻辑拆解
在
WebDriver接口中添加clear()方法
这相当于给WebDriver这张“名片”补上clear()的能力说明,所有实现/继承WebDriver的类(比如RemoteWebDriver、ChromeDriver)都要适配这个方法,编译器自然就认可driver.clear()的调用了。强制类型转换为
ChromeDriver
用((ChromeDriver) driver).clear()的写法,相当于直接告诉编译器:“别管这张WebDriver名片了,我确认这个实际对象就是ChromeDriver,你直接看它的方法列表就行”。编译器会去检查ChromeDriver的方法,自然能找到clear()。不过要注意,如果实际对象不是ChromeDriver,这种强转会抛出ClassCastException异常。
内容的提问来源于stack exchange,提问作者RArora
相关产品推荐
相关产品推荐

