在C#中,隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但编译器确定了类型。但在Java中,我们需要明确设置数据类型。如何用Java编写下面的代码
以下代码:
var newPostlink = message.findElement(By.tagName("a"))[0];
相信,我们需要将其设置为数组类型,但我正在努力编写这段代码
在C#中
public static void GoToNewPost() {
var message = Driver.getWebDriver().findElement(By.id("message"));
var newPostlink = message.findElement(By.tagName("a"))[0];
newPostlink.click();
在Java中:
public static void GoToNewPost() {
WebElement message = Driver.getWebDriver().findElement(By.id("message"));
var newPostlink = message.findElement(By.tagName("a"))[0];
newPostlink.click();
??? newPostlink = message.findElement(By.tagName("a"))[0];
在这里,您在findElement
类型的对象上调用方法WebElement
。根据文档,此方法返回类型WebElement
:
WebElement
findElement(By
by)使用给定方法查找第一个WebElement。
这是一个单个对象,而不是一个数组,所以你不能在Java中使用数组索引操作符,所以你不能把[0]
放在它后面。
查看C#文档,情况完全相同。所以最可能的答案是:你发布了错误的代码,而你实际上是想在该行中调用findElements
(复数)。
在这种情况下,Java版本返回一个List<WebElement>
,您可以像这样得到元素零:
WebElement newPostlink = message.findElements(By.tagName("a")).get(0);
但这有点无意义,因为这正是findElement
方法已经完成的工作:它返回找到的第一个元素。
所以你真正想要的是摆脱[0]
,然后使用WebElement
作为newPostlink
的类型:
WebElement newPostlink = message.findElement(By.tagName("a"));
我刚刚发现了Lombok val
type,它几乎就像C#var
关键字,除了它也被声明为final
(就像C#的readonly
)。
从Java 10开始,实际上存在局部变量的类型推断,请参阅JEP-286。
你可以写:
var user = new User();
但是,您只能将它用于for和for-each循环中的局部变量和变量。没有字段或方法返回值。
另一个限制是您必须立即为变量赋值,这不起作用:
var user;
user = new User();
但是你不能指定null。请注意,它仍然是静态类型,编译器只是在编译时推断类型,结果字节码确实包含类型信息,就像您明确声明类型一样。这意味着性能不受影响,因为在运行时没有额外的处理。
您可以下载JDK 10 Early Access build here。
有关更多详细信息,请参阅我写的this blog post。
Java是强类型的,没有推断的输入。另一个答案解决了您的问题但是对于您的另一个问题,遗憾的是您无法让编译器推断出变量的类型。