java - 动态实现接口(interface)?

标签 java oop selenium-webdriver

我正在考虑以下在 WebDriver2 中截取屏幕截图的示例:

WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

当类实现接口(interface)时,类必须实现接口(interface)中定义的方法,对吗?

那么,为什么在运行时我们实现了 TakeScreenshot 接口(interface),而不实现之前 getScreenshotAs 方法中的逻辑呢?

我尝试这样模拟它:

interface TakeScreenShot{ public void getScreenshotAs(); }

class WebDriver
{
    public static void main (String[] args) throws java.lang.Exception
    {
        WebDriver driver = new WebDriver();
        ((TakeScreenShot)driver).getScreenshot();
    }
}

我在 Ideone 中运行它,但遇到运行时错误:

运行时错误时间:0.05内存:711168信号:-1

那么,它在 WebDriver 中是如何工作的?

最佳答案

在您的第一个示例中,WebDriver 是一个接口(interface) - 并且接口(interface)不扩展 TakesScreenshot。因此,如果您有一个 声明 类型 WebDriver 的变量 driver,则无法调用 TakesScreenshot 中该变量的方法.

但是变量driver指向一个实际对象,该对象具有一个实现 - FirefoxDriver。并且 FirefoxDriver 确实实现了 TakesScreenshot 接口(interface)。

还有其他几种方法可以调用 getScreenshotAs 方法:

示例 1:

change the declared type of driver to FirefoxDriver which does implement TakesScreenshot:

FirefoxDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = driver.getScreenshotAs(OutputType.FILE);

示例 2:

cast WebDriver driver to FirefoxDriver instead of TakesScreenshot - because FirefoxDriver implements TakesScreenshot you can call methods from the latter interface directly through type FirefoxDriver.

WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((FirefoxDriver)driver).getScreenshotAs(OutputType.FILE);

现在,在第二个示例中,您有一个 WebDriver(不是接口(interface)),并且该类未实现 TakesScreenshot 因此您无法将其转换为该类型。

关于java - 动态实现接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786831/

相关文章:

java - Android 中已弃用的 People 类的替代方案

java - 为什么我在 GUI 中得到错误的日期时间格式?

java - 如何在Android logcat中像调试一样获取apache日志

c++ - 在 C++ 中将对象初始化为类成员

Java 迭代器类 - 无法解析符号 "E"

ruby - 使用 Watir 查找当前打开的浏览器 (firefox) 窗口

java - Files.newInputStream 中的 NoSuchFileException 与 StandardOpenOption.CREATE

oop - 是否可以从特征中访问结构字段?

ruby - 您如何使用 Selenium 2 和 Firefox 检查页面中的文本?

java - org.openqa.selenium.json.JsonOutput.write(Ljava/lang/Object;Ljava/lang/reflect/Type;) 由于 JsonException : Attempting to close incomplete json stream