0

Processing には、カスタム クラスから構築されたオブジェクトの ArrayList があります。関数を使用し.get()てオブジェクトの 1 つを返すと、オブジェクトは問題なく返されるように見えますが、オブジェクトの変数やメソッドのいずれにもアクセスできません。「[変数] を解決できないか、フィールドではありません」というエラー メッセージが表示されます。これはバグですか、それとも何か間違っていますか?

これがサンプルです。関数から返される値に注意してくださいsetup()

// regular array
Thing[] thinglist1 = new Thing[1];

// ArrayList array
ArrayList thinglist2 = new ArrayList<Thing>(1);

// instantiate the class
Thing thing = new Thing(12345);

// class definition
class Thing {
  int var;

  Thing(int i){
    var = i;
    thinglist1[0] = this;
    thinglist2.add(this);
  };
};

// run it!
void setup(){
  println(thinglist1[0] == thinglist2.get(0));
  // true

  println(thinglist1[0].var);
  // 12345

  println(thinglist2.get(0).var);
  // ERROR: "var cannot be resolved or is not a field"
};
4

2 に答える 2

9

あなたはちょっとあなたのジェネリックを台無しにしました。

変化する

ArrayList thinglist2 = new ArrayList<Thing>(1);

に:

ArrayList<Thing> thinglist2 = new ArrayList<Thing>(1);

タイプを指定しなかったため、実際には次のようになりました。

ArrayList<? extends Object> thinglist2 = new ArrayList<Thing>(1);

getそのため、 を使用してそこからアイテムを取得するとObjectThing

追加する編集:これの理由はレガシーです。ジェネリックが導入されたとき、下位互換性のために配置されました。残念ながら、これは Java の初心者にとっては混乱を招くような状況を引き起こします。

コンパイラの警告またはエラーが予想されると思われますが、Java は非ジェネリック型ArrayListを暗黙のうちに「オブジェクトを拡張するものを含む配列リスト」に変更します...これは、すべてのオブジェクトが暗黙的に拡張されるためです (プリミティブを除く)。Object

于 2013-06-23T04:08:09.420 に答える