首先為這個不太好的標題道歉,我是 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 它會起作用,但我認為我錯了。
感謝您在這里的任何幫助和學習:)
uj5u.com熱心網友回復:
你已經和PECS發生沖突了。我建議閱讀鏈接的答案以獲得更詳細的解釋,但這是特定于您的用例的位。
當你有一個泛型型別(List在你的情況下是 ,如果你只從中讀取List<? extends MyInterface>,你應該寫. 如果你只寫它,你應該寫List<? super MyInterface>. 如果你兩者都做,那么你想要List<MyInterface>. 我們為什么要做這個?好吧,看看你的代碼。
public void doStuff(List<TestInterface> testData) { ... }
這個函式需要一個List<TestInterface>. 該List界面具有大量功能。除了從中讀取之外,您還可以添加和洗掉內容。并doStuff期望TestInterface. 所以執行doStuffto do是完全公平的游戲
testData.add(new ClassIJustMadeUp());
假設ClassIJustMadeUp實作TestInterface。所以我們絕對不能傳遞這個函式 a List<ExtendTest>,因為那個串列型別不能包含ClassIJustMadeUp。
但是,如果您的函式僅從串列中讀取并且不打算向其中添加任何內容,則可以將簽名寫為
public void doStuff(List<? extends TestInterface> testData) { ... }
現在你可以傳遞任何擴展List的型別。可以從這個串列中閱讀,因為任何明確擴展的型別都可以安全地向上轉換為. 但是如果我們嘗試添加一個串列元素,那就是編譯器錯誤,因為串列不一定支持該特定型別。TestInterfaceTestInterfaceTestInterface
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494539.html
