如何声明接口类型的变量说明List并直接赋值?

时间:2014-12-09 23:16:36

标签: java selenium interface

我一直在思考selenium webdriver中的这段代码。现在,我确实理解Interfaces无法实例化,为此我们应该通过实现相同的类来实现。

代码如下:

List<WebElement> divElements ;
divElements = driver.findElements(By.tagName("div"));

是否可以分配如上所示的值(为什么?)或不应该:

List<WebElement> divElements=new ArrayList<>(); ;
divElements = driver.findElements(By.tagName("div"));

代码1是如何工作的?如果有人能澄清的话。

3 个答案:

答案 0 :(得分:2)

driver.findElements()的返回值是单个对象:WebElements列表。 这可以分配给变量divElements,就是这样。

您不必为结果分配空ArrayList。这是无效的,将丢失并在以下情况下收集垃圾:

divElemens = driver.findElements(..)

答案 1 :(得分:2)

两个片段之间的效果没有区别。

将任何变量(除了原始类型之一)视为对象的标签,而不是像一个小便条。您可以创建标签,将其粘贴在对象上,如果愿意,可以将其移动到另一个对象。您甚至可以将变量设置为null,这意味着它根本不会粘在对象上。

代码new ArrayList<>()创建一个新对象。第二个代码段中的代码会在该对象上放置一个标签(变量),但会立即将标签移动到完全不同的对象上。这使得原始ArrayList完全无关紧要。在其中一个代码段之后,变量divElements将粘贴到findElements方法返回的对象上。

答案 2 :(得分:1)

List<WebElement>类型的所有变量(以及java中的任何类类型)都是 references 。当你说

divElements = driver.findElements(By.tagName("div"));

它将divElements设置为findElements返回的任何引用。可能是findElements已经实例化了一个新对象,它是一个List(它可以是任何实现List的类);或者findElements可能会返回对之前创建的某个对象的引用;或者它可能会返回null。它并不重要。无论对象divElements之前引用的是什么,如果有的话,也无关紧要。引用将被新引用替换。

事情就在这里,除非findElements返回null,实现List 的对象 实例化 ,某个地方。首先这样做:

List<WebElement> divElements = new ArrayList<>();

只是意味着您将divElements设置为对新对象的引用,该对象将被抛弃。它没有任何有益的效果。