C#var类型的Java替代代码

问题描述 投票:1回答:4

在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();
java selenium
4个回答
1
投票
??? 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"));

1
投票

我刚刚发现了Lombok val type,它几乎就像C#var关键字,除了它也被声明为final(就像C#的readonly)。


0
投票

从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


-1
投票

Java是强类型的,没有推断的输入。另一个答案解决了您的问题但是对于您的另一个问题,遗憾的是您无法让编译器推断出变量的类型。

© www.soinside.com 2019 - 2024. All rights reserved.