首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将ArrayList<subtype>转换为ArrayList<type>

无法将ArrayList<subtype>转换为ArrayList<type>
EN

Stack Overflow用户
提问于 2012-04-13 07:45:51
回答 4查看 6.8K关注 0票数 3

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

代码语言:javascript
复制
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是神经元的一个子类型。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-13 07:48:11

您需要使用:

代码语言:javascript
复制
public interface Layer
{
    public ArrayList<? extends Neuron> getNeurons();
}

因为泛型中缺少协方差和逆方差。如果将ArrayList < INeuron >作为ArrayList < Neuron >返回,则可以将不是INeuron的元素(如Neuron的另一个子元素)添加到ArrayList < INeuron >中

票数 8
EN

Stack Overflow用户

发布于 2012-04-13 07:55:14

只需更改:

代码语言:javascript
复制
ArrayList<INeuron> neurons = new ArrayList<INeuron>();

至:

代码语言:javascript
复制
ArrayList<Neuron> neurons = new ArrayList<Neuron>();

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-13 07:51:23

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

代码语言:javascript
复制
void mymethod ( ILayer l )
{
     List<Neuron> neurons = l . getNeurons ( ) ;
     neurons . add ( new ONeuron ( ) ) ; // bad thing
}

我的方法mymethod只是用一个非INeuron污染了那个ILayerneurons列表。

我推荐Luciano's solution

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10133401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档