继承java对象的列表

继承java对象的列表,java,list,inheritance,Java,List,Inheritance,我创建了一个小例子。假设我有两门课: 公共类神经元{ ArrayList邻居=新的ArrayList(); int值=1; 公共神经元(){ } 公共无效连接(ArrayList DirectNeights){ for(神经元节点:DirectNeights){ this.neights.add(节点); } } } 以及从Neuron继承的类: 公共类特殊神经元扩展神经元{ int值=2; 公共专用神经元(){ } } 在我的例子中,我希望继承是为了避免很多“if object is sp

我创建了一个小例子。假设我有两门课:

公共类神经元{
ArrayList邻居=新的ArrayList();
int值=1;
公共神经元(){
}
公共无效连接(ArrayList DirectNeights){
for(神经元节点:DirectNeights){
this.neights.add(节点);
}
}
}
以及从Neuron继承的类:

公共类特殊神经元扩展神经元{
int值=2;
公共专用神经元(){
}
}
在我的例子中,我希望继承是为了避免很多“if object is special do something”的东西。然而,当我打电话时:

publicstaticvoidmain(字符串[]args){
ArrayList神经元=新的ArrayList();
神经元a=新神经元();
神经元b=新神经元();
神经元c=新神经元();
神经元。添加(b);
神经元。添加(c);
a、 连接(神经元);
ArrayList special=新的ArrayList();
特殊神经元d=新的特殊神经元();
特殊神经元e=新的特殊神经元();
特别报告员:添加(d);
特别报告员:添加(e);
a、 连接(特殊);//错误
}
不能将列表(SpecialNeuron)用于列表(Neuron)参数。这个电话有什么问题,有没有合适的方法来解决这个问题? 此外,我也能做到

ArrayList special=new ArrayList();
神经元d=新的特殊神经元();
神经元e=新的特殊神经元();
特别报告员:添加(d);
特别报告员:添加(e);
a、 连接(特殊)//很好

它可以工作,但拒绝使用SpecialNeuron类中的函数。

首先,您正在扩展
Neuron
类,但实际上并没有使用继承。您应该使
value
变量
protected
并在构造函数中设置其值

public class Neuron {
    protected int value;

    public Neuron() {
        this.value = 1;
    }
}

public class SpecialNeuron extends Neuron {
    public SpecialNeuron() {
        this.value = 2;
    }
}
现在,您的问题在第17行-
ArrayList special=new ArrayList()-您有
SpecialNeuron
对象的列表,这些对象是
Neuron
类的子对象,因此Java知道它只包含类
SpecialNeuron

connect()
函数中,您只接受
Neuron
类对象,因此为了使其工作,您必须将
特殊
列表更改为:

ArrayList<Neuron> special = new ArrayList<>();
ArrayList special=new ArrayList();

在此列表中,您可以添加
Neuron
SpecialNeuron
对象,并将其用作
Neuron
对象的列表。

您可以在Generic
中使用通配符。这是否回答了您的问题?您必须将特定的特殊神经元从神经元投射到该类,或者使用特殊神经元类中覆盖的所有神经元通用的方法。多态性将为您调用正确的版本。@Jems我在Neuron类中实现了空方法,该方法将在特殊Neuron类中被覆盖。由于多态性,它使我能够调用这些方法。谢谢你的想法:)我是否应该删除这个问题,因为我似乎不能确定一个具体的解决方案,而不是一个解决办法?你是对的,但是我不能解决这个类特有的特殊神经元的方法。非常有趣的功能。它适用于给定的示例,但不适用于我自己的项目。我的过错是由于缺乏解释。
  public void connect(ArrayList<? extends Neuron> directNeighbours) {
        for (Neuron node : directNeighbours) {
            this.neighbours.add(node);
        }
    }