Java下限类型List作为参数

时间:2016-01-16 15:09:27

标签: java

您好我有两个类:Person类和扩展Person的Employee类 它们看起来很简单

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);
    }


}

但是日食并不允许它 有错误消息: &#34;类型List中的方法add(capture#1-of?super Employee)不适用于参数(Person)

4 个答案:

答案 0 :(得分:3)

List<? super Employee>表示&#34;一些未知但具体类X的列表,即Employee超类

现在应该清楚为什么你不能将Person类型的对象添加到此列表中:Person不是X

也许,如果你解释了你在这里真正想做的事情,我们可以提供更多的帮助。

<强>更新: 实际上,我把它拿回来了。 Person X,因为它是Employee的子类,是X的子类。应该可以将它添加到列表中。看起来eclipse就是它的全部。 Javac(1.8)让我这样做,intellij也是如此。

很抱歉这个混乱。

答案 1 :(得分:0)

您不允许将Person实例放入List中,因为在调用函数时,您可以提供示例List集合。如果您能够将Person放入此集合中,这将导致访问此集合内容时出现ClassCastException,因为每个集合项都将被视为Employee(但Person实例无法转换为Employee)。

答案 2 :(得分:0)

你应该看一下:https://en.wikipedia.org/wiki/Liskov_substitution_principle

在这种情况下,您希望将Persion放在Employee列表中,但不是每个persion都是Employee,这就是它失败的原因。 如果列表期待人或任何扩展Person的内容,您将能够这样做。

List<? extends Person>

然后,您可以添加一个人,但也可以添加一名员工,因为每个员工都是一个人。

答案 3 :(得分:0)

要清楚,我不想向List添加一个Person类型的子类型的对象。我想添加一个Employee类型的超类型(祖先)的对象。 我想知道上述操作是否可行?

相关问题