簡體   English   中英

如何傳遞多個實現相同接口的類型?

[英]How to pass multiple Types that implement the same interface?

首先為這個不太好的標題道歉,我是 Java 新手,不知道如何命名。

我有一個接口類“TestInterface”:

ublic interface TestInterface {

    String getForename();

    void setForename(String forename);

    String getSurname();

    void setSurname(String surname);
}

“TestImpl”實現“TestInterface”:

public class TestImpl implements TestInterface{

    private String forename;

    private String surname;

    @Override
    public String getForename() {
        return forename;
    }

    public void setForename(String forename) {
        this.forename = forename;
    }

    @Override
    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
}

然后我有一個名為“ExtendTest”的調用,它擴展了“TestImpl”:

public class ExtendTest extends TestImpl{

    private String firstLineAddress;

    public String getFirstLineAddress() {
        return firstLineAddress;
    }

    public void setFirstLineAddress(String firstLineAddress) {
        this.firstLineAddress = firstLineAddress;
    }
}

然后我有這個“實體”類:


import java.util.List;

public class Entity {

    private List<TestInterface> testInterfaces;

    private List<ExtendTest> extendTests;

    public List<TestInterface> getTestInterfaces() {
        return testInterfaces;
    }

    public void setTestInterfaces(List<TestInterface> testInterfaces) {
        this.testInterfaces = testInterfaces;
    }

    public List<ExtendTest> getExtendTests() {
        return extendTests;
    }

    public void setExtendTests(List<ExtendTest> extendTests) {
        this.extendTests = extendTests;
    }
}

最后是這個“DoStuff”類,其中 dostuff 方法接受 List 類型的參數

import java.util.List;

public class DoStuff {

    public void doStuff(List<TestInterface> testData) {

    }
}

我嘗試這樣測試:

public class Main {


        public static void main(String[] args) {
            System.out.println("Hello, World!");

            DoStuff doStuff = new DoStuff();


            Entity entity = new Entity();

            // Works
            doStuff.doStuff(entity.getTestInterfaces());

            // Does not work
            doStuff.doStuff(entity.getExtendTests());

        }
}

但是,如果評論是“不起作用”,則它們是錯誤的

Required type:
List<TestInterface>
Provided:
List<ExtendTest>

我的問題是如何制作它以便我可以傳遞它。我的理解是,因為他們都實現了 TestInterface 它會起作用,但我認為我錯了。

感謝您在這里的任何幫助和學習:)

你已經和PECS發生沖突了。 我建議閱讀鏈接的答案以獲得更詳細的解釋,但這是特定於您的用例的位。

當你有一個泛型類型( List ,在你的情況下),如果你只從中讀取,你應該寫List<? extends MyInterface> List<? extends MyInterface> 如果你只它,你應該寫List<? super MyInterface> List<? super MyInterface> 如果你兩者都做,那么你需要List<MyInterface> 我們為什么要做這個? 好吧,看看你的代碼。

public void doStuff(List<TestInterface> testData) { ... }

此函數采用List<TestInterface> List接口有很多功能。 除了從中讀取之外,您還可以添加和刪除內容。 doStuff需要一個TestInterface列表。 所以執行doStuff是完全公平的游戲

testData.add(new ClassIJustMadeUp());

假設ClassIJustMadeUp實現了TestInterface 所以我們絕對不能給這個函數傳遞一個List<ExtendTest> ,因為這個列表類型不能包含ClassIJustMadeUp

但是,如果您的函數僅從列表中讀取並且不打算向其中添加任何內容,則可以將簽名寫為

public void doStuff(List<? extends TestInterface> testData) { ... }

現在您可以傳遞擴展TestInterface任何類型的List 可以從這個列表中閱讀,因為任何明顯擴展TestInterface的類型都可以安全地向上轉換為TestInterface 但是如果我們嘗試添加一個列表元素,那就是編譯器錯誤,因為列表不一定支持該特定類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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