2012-04-12 12 views
2

私は人工ニューラルネットワークをシミュレートするプログラムを作成しています。私は、次のクラスおよびインタフェースは、設定している:ArrayList <subtype>をArrayListに変換できません<type>

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の<INeuron>から変換することはできません。」

私は物事を切り替えることを試みました。たとえば、ArrayList<Neuron> neurons = new ArrayList<INeuron>()です。しかし、それはクラスの異なる部分に同じエラーをシフトするようです。

INeuronがNeuronのサブタイプであるため、なぜINeuronが暗黙的にNeuronにキャストできないのか分かりません。

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

ためジェネリック医薬品における共変性と反変性の不足のため:

+0

正しい解決策は、返されたリストの意図された用途が何であるかによって変わります。 'Generic 'は正当な理由で 'Generic 'ではありません。 – trutheality

答えて

8

あなたが使用する必要があります。あなたはArrayListの<ニューロンとしてArrayListの< INeuron>を返す場合>、あなたは潜在的に< INeuron>

2

これは一例ですArrayListに(ニューロンの別の子のような)INeuronない要素を追加することができるだろう起こる可能性のある悪いことの

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

だけ非INeuronILayerさんneuronsリストという汚染mymethod私の方法。

Luciano's solutionをお勧めします。

+0

いいキャッチ!これはクラスのためのものです(私は先生です)。私たちは来週、Iteratorを使うようにAPIを変更します。 –

+0

@BarryBrown Iteratorの問題と同じような問題に対処する必要があります。 – trutheality

+0

ええ、私はそれを見ている...より良い解決策はありますか? –

3

単に変更:

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

をする:

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

両方のタイプのサービスを提供できるようにします。

0
public Layer <?> getNeurons(); 

これはサブタイプを書き込む別の方法です。

関連する問題