3

我正在编写一个程序来模拟人工神经网络。我设置了以下类和接口:

public interface Neuron
{
}

// Input neuron
public class INeuron implements Neuron
{
}

// Output and hidden neuron
public class ONeuron implements Neuron
{
}

public interface Layer
{
    public ArrayList<Neuron> getNeurons();
}

// Input layer
public class ILayer implements Layer
{
    ArrayList<INeuron> neurons = new ArrayList<INeuron>();

    public ArrayList<Neuron> getNeurons()
    {
        return neurons;
    }

    // other stuff appropriate to the input layer
}

编译器报告“无法从 ArrayList<INeuron> 转换为 ArrayList<Neuron>”。

我试过换东西。例如:ArrayList<Neuron> neurons = new ArrayList<INeuron>()。但这似乎只是将相同的错误转移到班级的不同部分。

我不明白为什么 INeuron 不能隐式转换为 Neuron,因为 INeuron 是 Neuron 的一个子类型。

4

4 回答 4

8

你需要使用:

public interface Layer
{
    public ArrayList<? extends Neuron> getNeurons();
}

因为泛型缺乏协变和逆变。如果您将 ArrayList < INeuron > 作为 ArrayList < Neuron > 返回,那么您可能能够将不是 INeuron 的元素(如 Neuron 的另一个孩子)添加到 ArrayList < INeuron >

于 2012-04-12T23:48:11.300 回答
4

简单地改变:

ArrayList<INeuron> neurons = new ArrayList<INeuron>();

到:

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

能够同时服务于这两种类型。

于 2012-04-12T23:55:14.287 回答
2

这是可能发生的坏事的一个例子。

void mymethod ( ILayer l )
{
     List<Neuron> neurons = l . getNeurons ( ) ;
     neurons . add ( new ONeuron ( ) ) ; // bad thing
}

我的方法只是用 nonmymethod污染了该列表。ILayerneuronsINeuron

我推荐卢西亚诺的解决方案

于 2012-04-12T23:51:22.760 回答
0
public Layer <?> getNeurons();

这是编写子类型的另一种方式,对吧?

于 2015-12-09T04:46:51.583 回答