2

スーパークラスを拡張するクラスSubClass1とSubClass2があるとします。 SuperClassを拡張しているすべてのオブジェクトをリスト(Listリスト)に格納する必要があります。今度はリストを関数に渡します。これはSuperClassが以前にあったSubClassを把握することができます。この関数は、SuperClassをそれぞれのサブクラスに戻す必要があります。たとえば、スーパークラスとしてサブクラスオブジェクトを格納し、後でサブクラスを取得する

for (SuperClass superClass : list) { 
    if (superClass.getType().equals("SubClass1") 
     SubClass1 subClass = (SubClass1) superClass; 
    else if (superClass.getType().equals("SubClass2") 
     SubClass2 subClass = (SubClass2) superClass; 
} 

この例では、クラスキャストの例外が発生します。この機能を実現する簡単なソリューションはありますか?

EDIT:答えの1つに記載されているとおり、このコードでは例外が発生するはずです。この例のgetType()メソッドで何かが間違っていなければなりません。ただし、キーワードinstanceofを使用することで、getType()メソッドが不要になるため、この問題を解決できます。

答えて

5

instanceof operatorを使用してください。

for (SuperClass superClass: list) { 
    if (superClass instanceof SubClass1) { 
     SubClass1 subClass = (SubClass1) superClass; 
    } 
    else if (superClass instanceof SubClass2) { 
     SubClass2 subClass = (SubClass2) superClass; 
    } 
    else { 
     // Something strange has happened, or superClass is null 
    } 
} 
1

はい、

代わりのオブジェクトからタイプを達するあなただけの他の単語あなたcompare the typesにいくつかのタイプにオブジェクトのインスタンスをテストすることができます。場合

if(superClass instanceof SubClass1) { 

    } 

superClassがあれば、リターンはfalse、nullあるとき。

1

この例では例外がスローされません。簡単なテスト:あなたは、クラスのキャスト例外がある場合は

List<SuperClass> list = new ArrayList<SuperClass>(); 
    int count = 50; 
    Random random = new Random(); 
    while(count-- > 0) { 
     if(random.nextBoolean()) { 
      list.add(new SubClass1()); 
     } else { 
      list.add(new SubClass2()); 
     } 
    } 

    for (SuperClass superClass : list) { 
     if (superClass.getType().equals("SubClass1")){ 
      SubClass1 subClass = (SubClass1) superClass; 
      System.out.println(subClass); 
     }else if (superClass.getType().equals("SubClass2")){ 
      SubClass2 subClass = (SubClass2) superClass; 
      System.out.println(subClass); 
     } 
    } 

は、クラスの一つの最も可能性の高いgetType()実装では、あなたのサブクラスのクラスキャストexception.Or 1は、スーパークラスを拡張しない持っている理由です、間違った値を返します。

関連する問題