2015-12-22 96 views
1

在C#中,隱式類型化的局部變量是強類型的,就像您自己聲明類型一樣,但編譯器確定類型。但在Java中,我們需要明確設置數據類型。如何寫下面的代碼在Java中C#var類型的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(); 

回答

1
??? newPostlink = message.findElement(By.tagName("a"))[0]; 

這裏您對WebElement類型的對象調用方法findElement。根據文檔,則此方法返回一個類型WebElement

WebElement findElement(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

的Java是強類型的,並且不能推斷出打字。另一個答案解決了你的問題,但是對於你的另一個問題,你不幸的是無法讓編譯器推斷你的變量的類型。

+1

這根本不是真的。 'var'關鍵字_is_強類型。問題是你必須在等號左邊聲明變量類型,然後從右邊指定相同類型。如果不匹配,那麼編譯器會抱怨。這實際上意味着你是雙重聲明變量類型。在C#中,如果使用'var'關鍵字,那麼編譯器會自動爲變量賦予與其被賦值類型相同的類型。如果你然後嘗試使用該變量作爲不同的類型,那麼你會得到一個編譯器錯誤。 –

1

我剛剛找到了Lombok val type,這幾乎是完全一樣的C#var關鍵字,但它也被宣佈爲final(如C#的readonly)。

0

從Java 10開始,實際上存在局部變量的類型推斷,請參閱JEP-286

你可以這樣寫:

var user = new User(); 

但是,你只能在和-每個循環使用它的局部變量和變量。沒有字段或方法返回值。

另一個限制是,你馬上每畝賦值給變量,這不起作用:

var user; 
user = new User(); 

您不能分配空雖然。請注意,它仍然是靜態類型,編譯器只是在編譯時推斷類型,並且生成的字節碼確實包含類型信息,就像您明確聲明類型一樣。這意味着性能不受影響,因爲在運行時沒有額外的處理。

您可以下載JDK 10 Early Access build here

欲瞭解更多詳情,請參閱我寫的this blog post