Class1とClass2、Class1objの2つのクラスがあります。Class2 obj1; objがClass2のインスタンスであると比較するにはどうすればよいですか?これらのクラスにinstanceOf演算子を使用できません。「互換性のない型を比較できません」というコンパイルエラーが発生します。
3 に答える
コンパイル時に失敗する場合は、実行時に常に失敗することを確認できます。コンパイラはinstanceof
、最初のタイプが2番目のインスタンスになることができない2つのタイプでの使用を許可しません。例えば:
Integer i = 5;
if (i instanceof String) {
System.out.println("Never happen");
}
コンパイラは、整数が同じ継承階層にないため、整数が文字列になることは決してないことを明確に知っています。したがって、それはあなたにそれを書くことさえさせません。とにかくそれを書きたくなったら、デザインやロジックに何か問題があります。
そうは言っても、Class.isAssignableFrom()は、実行時にのみ失敗する可能性のある継承階層をチェックする別の方法です。
Integer i = 5;
if (String.class.isAssignableFrom(i.getClass())) {
System.out.println("Never happen");
}
上記は正常にコンパイルされますが、条件が真になることは決してありません。タイプが同じ継承階層にある場合にのみ、タイプを比較することは意味があります。たとえば、これは次のような賢明な比較です。
Number n = 1;
if (n instanceof Integer) {
System.out.println("I'm an int!");
} else if (n instanceof Long) {
System.out.println("I'm a long!");
}
ただし、このようなコードを記述したい場合は、ほとんどの場合、コードのポリモーフィズムが壊れていることを意味します。これは、まさにそれが処理することになっている種類のことだからです。
これはコンパイルされません:
String s = "42";
if (s instanceof Integer) {
....
}
しかし、これは:
String s = "42";
Object o = s;
if (o instanceof Integer) {
....
}
理解すべきことは、静的型チェックを行うときに、コンパイラが式の宣言された型を使用していることです。最初のケースでは、s
は typeString
を持ち、 aString
は an になることはできませんInteger
。2 番目のケースでo
は、タイプがあり、代入可能Object
なものが である可能性があります。(もちろん、参照する実際のインスタンスはインスタンスまたはサブタイプではないため、2 番目の例のテストは常に ... と評価されます。)Object
Integer
false
o
Integer
申し訳ありませんが、私が間違っていなければ、スペルと単語の書き方が間違っています..
その instanceof であり、instanceOf ではありません