首页 > 解决方案 > java继承对象列表

问题描述

我创建了一个小例子。想象一下我有两个课程:

public class Neuron {
    ArrayList<Neuron> neighbours = new ArrayList<>();
    int value = 1;

    public Neuron() {

    }

    public void connect(ArrayList<Neuron> directNeighbours) {
        for (Neuron node : directNeighbours) {
            this.neighbours.add(node);
        }
    }

}

和一个继承自 Neuron 的类:

public class SpecialNeuron extends Neuron {

    int value = 2;

    public SpecialNeuron() {

    }
}

在我的情况下,我想要继承以避免很多“如果对象是特殊的做某事”的东西。但是,当我打电话时:

public static void main(String[] args) {
    ArrayList<Neuron> neurons = new ArrayList<>();

    Neuron a = new Neuron();
    Neuron b = new Neuron();
    Neuron c = new Neuron();
    neurons.add(b);
    neurons.add(c);

    a.connect(neurons);

    ArrayList<SpecialNeuron> special = new ArrayList<>();
    SpecialNeuron d = new SpecialNeuron();
    SpecialNeuron e = new SpecialNeuron();
    special.add(d);
    special.add(e);

    a.connect(special); //Error
}

不能将 List(SpecialNeuron) 用于 List(Neuron) 参数。这个电话有什么问题,有没有解决这个问题的正确方法?此外,我可以做

ArrayList<Neuron> special = new ArrayList<>();
Neuron d = new SpecialNeuron();
Neuron e = new SpecialNeuron();
special.add(d);
special.add(e);

a.connect(special); //works fine

哪个有效,但拒绝使用 SpecialNeuron 类中的函数。

标签: javalistinheritance

解决方案


您可以在 Generic 中使用 WildCards。您可以在此处<? extends T>阅读有关它的更多信息。

将您的方法参数更改为此。

  public void connect(ArrayList<? extends Neuron> directNeighbours) {
        for (Neuron node : directNeighbours) {
            this.neighbours.add(node);
        }
    }

推荐阅读