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