2016-04-10 8 views
10

間違ったクラスでinstanceof演算子を使用しようとすると、コンパイルエラー( "Animal can not be String to")に変換されますが、インターフェイスでコンパイルエラーが発生しません。instanceof with an interface

たとえば:行10では、AnimalがStringのサブクラスではないため、コンパイルエラーが発生します。しかし、14行目では、AnimalがListインターフェースを実装していなくても、コンパイルエラーは発生しません。

class Animal { 

} 

public class InstanceOf { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Animal a = new Animal(); 
     if (a instanceof String){ //line 10 
      System.out.println("True"); 
     } 

     if (a instanceof List){ //line 14 
      System.out.println("True"); 
     } 
    } 

} 
+0

質問に正確なエラーメッセージを含めてください。 –

+0

これを考えてみましょう: 'クラスBはAnimal implements List'を拡張します。今度は: 'Animal a = new B();' – njzk2

+0

@ Tunakiあなたは「Dupehammer®」も持っています。なぜそれを閉じなかったのですか? (おそらく:あなたは私と同じように躊躇しています...: - /) – Marco13

答えて

18

aは、決してinstanceof Stringにはなりません。したがって、コンパイルエラーです。 AnimalのいくつかのサブクラスはListインタフェースを実装し、あなたがaに、このようなサブクラスのインスタンスを割り当てるかどう

aListのインスタンスにすることができます。したがって、コンパイラで許可されます。 JLSから

するReferenceTypeへの関係式のキャスト(§15.16)はコンパイル時にエラーとして拒否される場合は、その後のinstanceof関係式も同様に、コンパイル時エラーを生成します。このような状況では、instanceof式の結果は真にならない可能性があります。

+1

Javaは複数の継承が根本的な理由ではありませんか?同時に、必要に応じて任意のサブクラスがInterfaceを実装できます。 – nantitv

+3

@nantitvはい。 AnimalはStringのサブクラスではないため、AnimalのサブクラスはStringのサブクラスであることはできません。特定のスニペットでは、複数の継承が許可されても、Stringは最終的でサブクラス化できないため、違いはありません。 – Eran

+0

ありがとうございます。ストリング私はちょうど例のためにそれを取った。 – nantitv

1

この質問から私はちょうど実験を行いました。 Animalとして@Eran前記よう

class Animal {} 
interface AnimalA {} 
class AnimalB{} 

class AnimalC extends Animal,AnimalB {} //not possible 
class AnimalD extends Animal implements AnimalA{} //possible 

public class InstanceOfTest { 

    public static void main(String[] args) { 
     Animal a = new Animal(); 
     if(a instanceof AnimalA) { //no compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof AnimalB) { //compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof List) { //compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof ArrayList) { //compile time error 
      System.out.println("interface test"); 
     } 
    } 
} 

は、そのなることができ、サブクラスとAnimalBのインスタンスのAnimalB以外のサブクラスではありません。しかし、他のサブクラスでは、interfaceリストを実装することができます。