我正在写一个模拟人工神经网络的程序。我设置了以下类和接口:
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转换为ArrayList”。
我试过换个地方。例如:ArrayList<Neuron> neurons = new ArrayList<INeuron>()。但这似乎只是将相同的错误转移到类的不同部分。
我不明白为什么INeuron不能隐式转换为神经元,因为INeuron是神经元的一个子类型。
发布于 2012-04-13 07:48:11
您需要使用:
public interface Layer
{
public ArrayList<? extends Neuron> getNeurons();
}因为泛型中缺少协方差和逆方差。如果将ArrayList < INeuron >作为ArrayList < Neuron >返回,则可以将不是INeuron的元素(如Neuron的另一个子元素)添加到ArrayList < INeuron >中
发布于 2012-04-13 07:55:14
只需更改:
ArrayList<INeuron> neurons = new ArrayList<INeuron>();至:
ArrayList<Neuron> neurons = new ArrayList<Neuron>();能够同时服务于这两种类型。
发布于 2012-04-13 07:51:23
这是一个可能发生的坏事的例子。
void mymethod ( ILayer l )
{
List<Neuron> neurons = l . getNeurons ( ) ;
neurons . add ( new ONeuron ( ) ) ; // bad thing
}我的方法mymethod只是用一个非INeuron污染了那个ILayer的neurons列表。
https://stackoverflow.com/questions/10133401
复制相似问题