[英]Java lower bounded type List as parameter
您好,我得到了兩個類:Person類和Employee類,它們擴展了Person,它們看起來非常簡單
public class Person {
private String name;
private String surname;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public Person(String name, String surname) {
super();
this.name = name;
this.surname = surname;
}
}
public class Employee extends Person {
private String salary;
private String position;
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public Employee(String name, String surname, String salary, String position) {
super(name, surname);
this.salary = salary;
this.position = position;
}
}
我想編寫一個將Person添加到下界參數化列表的函數
public class AuxiliaryClass {
public static void addToList(List<? super Employee> list){
Person osoba1 = new Person("Czeslaw","Spiewa");
list.add(osoba1);
}
}
但是eclipse不允許出現錯誤消息:“列表類型中的方法add(capture#1-of?super Employee)不適用於參數(人)
List<? super Employee>
List<? super Employee>
意思是“一些未知但具體的類X的列表,它是Employee
的超類 。
現在應該清楚為什么不能將Person
類型的對象添加到此列表中: Person
不是X
也許,如果您解釋了您的意思,那么我們可能會提供更多幫助。
更新 :實際上,我收回了它。 Person
是 X
,因為它是Employee
的子類, Employee
是X
的子類。 應該可以將其添加到列表中。 看起來月食就充滿了。 Javac(1.8)允許我執行此操作,intellij也是如此。
對困惑感到抱歉。
您不允許將Person實例放入列表,因為調用函數時可以提供例如List集合。 如果您能夠將Person放入此集合中,這將導致在訪問此集合內容時發生ClassCastException,因為每個集合項都將被視為Employee(但Person實例不能轉換為Employee)。
您應該看一下: https : //en.wikipedia.org/wiki/Liskov_substitution_principle 。
在這種情況下,您想將Persion放在Employee列表中,但並不是每個Persion都是Employee,這就是為什么它失敗的原因。 如果列表中包含“期望人物”或任何擴展“人物”的內容,您將能夠做到這一點。
List<? extends Person>
然后,您可以添加一個人,但也可以添加一個員工,因為每個員工都是一個人。
為了清楚起見,我不想在列表中添加一個類型為Person的子類型的對象。 我想添加一個對象,它是Employee類型的超類型(祖先)。 我想知道上述操作是否可行?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.