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