【问题标题】:Can't convert ArrayList<subtype> to ArrayList<type>无法将 ArrayList<subtype> 转换为 ArrayList<type>
【发布时间】:2012-04-25 09:05:53
【问题描述】:

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

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&lt;Neuron&gt; neurons = new ArrayList&lt;INeuron&gt;()。但这似乎只是将相同的错误转移到班级的不同部分。

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

【问题讨论】:

  • 正确的解决方案将取决于您对该返回列表的预期用途(只是阅读?修改?)。 Generic&lt;SubType&gt; 不是 Generic&lt;Type&gt; 有充分的理由。

标签: java arraylist type-conversion


【解决方案1】:

你需要使用:

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

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

【讨论】:

    【解决方案2】:

    简单的改变:

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

    到:

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

    能够同时为这两种类型提供服务。

    【讨论】:

      【解决方案3】:

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

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

      我的方法mymethod 刚刚用非INeuron 污染了ILayerneurons 列表。

      我推荐Luciano's solution

      【讨论】:

      • 好收获!这是上课的(我是老师)。下周我们将更改 API 以使用迭代器。
      • @BarryBrown 您还必须为迭代器处理同样的问题。
      • 是的,我看到了...有更好的解决方案吗?
      • 正如真实性所说,“正确的解决方案将取决于您对该返回列表的预期用途”。根据您的代码示例,我推荐 Luciano 的解决方案。为什么不满意?
      【解决方案4】:
      public Layer <?> getNeurons();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 2012-07-05
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 2018-05-25
        • 2017-10-29
        相关资源
        最近更新 更多