1

次のコードはコンパイルして「いいえ」を出力すると思いました

class One{
 public static void main(String[] args) {

   One o = new One();
   if(o instanceof Two) {
     System.out.println("Yes");
   } else {
     System.out.println("No");
   }
 }
}

class Two { }

しかし、オブジェクトが継承階層にあるかどうかをオペレーターがチェックして、そうでない場合は返すinconvertible types 必要がないことを示すコンパイラエラーがスロー されますinstanceoftruefalse

編集:

特定の条件が真になることは決してないことを既に知っているコンパイラの場合であり、コンパイラエラーをスローする場合、なぜこのコードはコンパイルされているのですか

if(false) {
  System.out.println("Yes");
}
4

4 に答える 4

4

Twoo はクラスのインスタンスOneTwoはなく、継承関係がないことをコンパイラが判断できるため、このメッセージが表示されます。

多分あなたは書くつもりだった:

Object o = new One();

その場合、あなたのテストは理にかなっています。

于 2013-10-01T12:39:09.673 に答える
4

「o」変数を「One」型として宣言したためだと思います。コードをこれに変更すると、コンパイルされるはずです

   Object o = new One();
   if(o instanceof Two) {
     System.out.println("Yes");
   } else {
     System.out.println("No");
   }

instanceof 演算子は、型が事前にわからない場合に使用するためのものです。したがって、メソッド パラメーターを介して入ってくる何かのオブジェクトがある場合、または変数が基本クラスの型で宣言されていて、サブクラスの型ごとに異なる動作をさせたい場合。あなたが提供したシナリオでは、コンパイラはコンパイル時に、あなたが書いたことが決して真実ではないことを伝えることができ、そうします。

編集:if(false)多くの人が次のようなパターンを使用するため、コンパイルします:

public class Application{

    private static final boolean DEBUG = true;

    public static void main(String args[]){
        if(DEBUG){
            System.out.println("Debugging information");
        }
    }
}

この種のパターンがいくつかの場所で繰り返される大規模なアプリケーションを想像してみてください。コンパイラがこれをコンパイルすることを拒否した場合、DEBUG モードからの切り替えがはるかに難しくなります。

以前の説明で、「コンパイラはコンパイル時に、あなたが書いたことが決して真実ではないことを伝えることができる」という言葉を使うべきではなかったかもしれません。より良い説明は、「コンパイラは、あなたが書いていることが意味をなさないことを伝えることができます」です。

于 2013-10-01T12:39:14.677 に答える
0

instanceof別のクラスの参照変数によってポリモーフィックに参照されるオブジェクトを識別するために使用されるため、参照変数oがクラスのオブジェクトを参照できない場合、Twoコンパイルされません。

したがって、この:

One o = new One();
if(o instanceof Two) {
    System.out.println("ok");
}

たとえば、次のようなエラーになります。

int i = 1;
if (i == "s") {
    System.out.println("ok");
}

まったくコンパイルできません!

編集

コードをコンパイルするポリモーフィズムの例(他の回答による):

Object o = new One();

を参照o できるためTwo、参照できるinstanceofかどうかがわかります。

于 2013-10-01T12:56:14.293 に答える