我正在考虑以下在 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
toFirefoxDriver
which does implementTakesScreenshot
:
FirefoxDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = driver.getScreenshotAs(OutputType.FILE);
示例 2:
cast
WebDriver driver
toFirefoxDriver
instead ofTakesScreenshot
- becauseFirefoxDriver
implementsTakesScreenshot
you can call methods from the latter interface directly through typeFirefoxDriver
.
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/