2012-04-30 3 views
2

引数として渡された2つのオブジェクトを比較しようとすると、最初はオブジェクトとして、2番目はオブジェクトの配列(同じ種類)として比較されます。エラーIncompatible conditional operand types Room and allRooms[]を取得しています。私はwhileまで繰り返して、thisRoomTypeまでのサイクルは、roomsのオブジェクトと等しくないようにしようとしています。それを修正するには?instanceofを使用して2つのオブジェクトを比較できません

public abstract class Room { ...} 
public class LightRoom extends Room {...} 
public class DarkRoom extends Room {...} 

発信者:メソッドで

private Room thisRoomType = this; // is defined in DarkRoom and LightRoom 
private Room[] rooms; // is defined in DarkRoom and LightRoom 

パラメータを持つ

release(thisRoomType, rooms) 

public synchronized void release(Room thisRoom, Room[] allRooms) { 

     try { 
      int j = 0; 
      while(thisRoom instanceof allRooms[j]){  
       jj++; 
      } 
         int nextRoom = jj; 
... 
    } 
} 
+1

これが起こるのを待っ 'ArrayIndexOutOfBoundsException'あるに応じて選んでください。 'while'条件に' jj

答えて

6

代わりにこれを試してみてください:

while (j < allRooms.length && thisRoom.getClass().equals(allRooms[j].getClass())) 
+0

@RCola申し訳ありませんが、あなたは私の前のバージョンの答えを見ました。更新されたものを試してみてください。 –

+0

サブタイプでは動作しません – ewernli

+2

@ewernli問題があるかどうかはわかりません。前述のように、OPの質問は常にArrayIndexOutOfBoundsExceptionが発生するまでループします。ヌル以外の 'Room'は常にRoom []内のnull以外の要素のインスタンスになります。コードは、異なる種類の部屋に遭遇した場合にのみ意味をなさないかもしれません。それが私の答えです。 –

2

あなたのロジックは間違っています。
instanceofは、オブジェクトインスタンスallRooms[j]を渡している間に、ReferenceTypeが必要です。これは決してうまくいかない。あなたがやるべきことは何
は次のとおりです。

  1. package名や
  2. class名または
  3. と比較具象クラス(getClass)と比較。

は、ニーズ

関連する問題