[英]Java - How can a method return a variable type object without knowing the resulting type at compile time?
假設您有一個接口和兩個實現該接口的類:
public interface IElement {
boolean isDisplayed();
}
public class Button implements IElement {
@Override
public boolean isDisplayed() {
// checks if displayed
return false;
}
public void click() {
// clicks
}
}
public class Textbox implements IElement {
@Override
public boolean isDisplayed() {
// checks if displayed
return false;
}
public void enterText(String text) {
// enters text
}
}
在完全獨立的類中,我們有一個方法要根據提供的參數值返回Button或Textbox。 像這樣的東西:
public class WhichElement {
public <T extends IElement> T getElement(String elementName) {
if (elementName.equalsIgnoreCase("button")) {
return new Button();
}
else if (elementName.equalsIgnoreCase("textbox")) {
return new Textbox();
}
}
}
但是,這失敗了,因為返回的對象不是T類型。我嘗試僅返回如下接口:
public IElement getElement(String elementName)
但是,然后我不能做我真正想做的事情,這是:
WhichElement picker = new WhichElement();
picker.getElement("button").click(); <-- errors here because it's an IElement not a Button :(
我可以將其強制轉換為正確的對象,並信任該方法以返回與強制轉換為相同的對象...但這似乎很危險。 我寧願該方法確定所需對象的類型並直接返回該對象。 有沒有辦法做我想做的事?
您可以在返回之前將getElement()
的結果getElement()
為T
,這將產生編譯器警告。
出現警告是因為編譯器將在調用站點插入ClassCastException
類型轉換,並且如果運行時結果的類型不正確,則會從沒有明顯ClassCastException
類型轉換的位置拋出ClassCastException
。 本質上,如果getElement()
不是通用的,則編譯器會生成與編寫的代碼相同的代碼,並僅返回IElement
。
代替一種生產多種類型的工廠方法,而是為每種類型創建不同的工廠方法。 這將為您提供類型安全性,確保實際提供了應用程序所需的每個元素,有助於重構,並將運行時錯誤(如getElement("buttton")
更改為編譯時錯誤。
依賴注入是另一種方法:給應用程序一個按鈕,而不是自己定位一個按鈕。
有兩種方法。
public Button getButton() {
return new Button();
}
public Textbox getTextbox() {
return new Textbox();
}
在語義和代碼方面沒有太大區別
picker.getButton() // Strongly typed
picker.getElement("button") // Stringly typed
再加上字符串類型的版本更長。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.