簡體   English   中英

Java-方法如何在編譯時不知道結果類型的情況下返回變量類型的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM