2017-06-23 3 views
-4

私は犬と魚のオブジェクトをLinkedListに格納しようとしていますが、拡張ループが機能しないのはなぜですか?foreachは型には当てはまりません

public class Main { 

    public static void main(String[] args) { 
     AnimalList animal = new AnimalList(); 
     Animal dog = new Dog(); 
     Animal fish = new Fish(); 

     animal.add(dog); 
     animal.add(fish); 
    } 
} 

import java.util.LinkedList; 
import java.util.List; 

public class AnimalList { 
    private List<Animal> theList = new LinkedList<>(); 

    public void add(Animal animal) { 
     for (Animal x: animal) { <--------- foreach not applicable to type. 
      theList.add(x); 
      System.out.println(x); 
     } 
    } 
} 

public class Animal { 
} 

public class Dog extends Animal { 
} 

public class Fish extends Animal { 
} 
+2

ヒント:「メイン」の「動物」と「追加」の「動物」は、2つの異なる動物です。 – dasblinkenlight

+1

「動物の各動物のために」はあまり意味がありません。とにかくやるべきfor-loopは何ですか?私は何かをループする理由は見当たりません。あなたはfor-loopが何をしているか知っていますか? – Dukeling

+0

私は各動物のための動物のオブジェクト(犬と魚)は私が作成する(このコードで行っていない)と考えていた、私はリンクされたリストにこれらのオブジェクトを格納します。これは理にかなっていますか? – ben

答えて

1

基本的に、あなたはここでいくつかの簡単な間違いを犯しました。そして、私の考えでは、これらのミスをリンクする共通のスレッドは、作成しているクラスの目的をはっきりと認識していません。

たとえば、Animalクラスは、1つの獣を表します。獣のコレクションではありません。動物を別の動物に「追加」することはありません。動物は他の動物を含まないことになります。あなたが開発したシンプルな「世界モデル」では、これらのことはどちらも意味をなさない。しかし

、あなたが書かれています:

animal.add(dog); 
    animal.add(fish); 

と、これを:

for (Animal x: animal) 

今コンパイラが何かが間違っていることを見ることができます:

  • それは、がないことを知っている方法はAnimalクラス

  • それはAnimalは動物が含まれている動物を反復処理する方法であると思われる... Iterable<Animal>を実装していないことを知っているために宣言しました。

コンパイラができないことは、これらの間違いを引き起こした思考過程を理解することです。それはあなたに言うことができません: "それは動物が動物を含むことに意味がない!

実行しようとしているタスクについて考えて理解することは、あなたの仕事です。これがプログラマーとしてコンピュータではなく人が雇われている理由です。


ここでは何をすべきですか。コードの各行を見て、自分自身に尋ねます。

  1. これはプログラムに何を指示していますか?
  2. これは実際には意味がありますか?

「顔面修正」から回復した場合は、エラーを修正してください。


1 - 私は比喩的な意味で「理解」「知っている」と、「参照」を使用しています。コンパイラは思考や理解ができません。書かれたプログラムが有効なJavaコードであるかどうかを判断する一連のルールを適用するだけです。しかし、それは私がここで作ろうとしているポイントです。

関連する問題