0

オブジェクトのスタックがあります。このスタックで、ClassAオブジェクトとClassBオブジェクトをプッシュします。このスタックからオブジェクトを返さなければならないメソッドがあります

public Object method(Stack s){
    ClassA a = new ClassA();
    stack.push(a);
    ClassB b = new ClassB();
    stack.push(b);
    while(stack has two elements) stack.pop();
    return stack.pop()// I return the last element
}

問題は次のとおりです。このメソッドを呼び出すと、instanceofが機能せず、ClassAとClassBを区別できなくなります。

Object o = method(s);
if ( o instanceof ClassA){
    //do something
} else if (o instanceof ClassB) {
    //do something else
}

内部のmethod(Stack s)instanceofは機能しますが、外部は機能しませんが、toString()メソッドは正常に機能し、各クラスに適切な文字列を返します。

4

1 に答える 1

4

イントロスペクション コードが期待どおりに機能しないシナリオがいくつかあります。

  • の場合、演算子は を返しoます。JLSによると、値はどのタイプのインスタンスでもありません...。nullinstanceoffalsenull

  • ClassBが のサブタイプでclassAある場合、 のインスタンスをo instanceof ClassA返します。trueClassB

  • クラスローダーで複雑なことをしている場合、同じ「.class」ファイルを異なるクラスローダーでロードすることができます。そうすると、クラスの 2 つの「コピー」が実際には異なる型を持ち、instanceofを返すという問題に遭遇しfalseます。(この動作は JLS でも指定されています。)

後者のケースは、2 つのクラスの名前を見ると同じであるため、特に混乱する可能性があります。ただしclass1.equals(class2)、 orclass1 == class2は、2 つのクラスが実際に同じかどうかについて決定的な答えを提供します。

于 2012-10-27T13:38:17.607 に答える