7

次のコードブロックがあるとしましょう。

if (thing instanceof ObjectType) {
    ((ObjectType)thing).operation1();
    ((ObjectType)thing).operation2();
    ((ObjectType)thing).operation3();
}

すべての型キャストはコードを醜く見せますが、そのコードブロック内で「thing」をObjectTypeとして宣言する方法はありますか?私は私ができることを知っています

OjectType differentThing = (ObjectType)thing;

それ以降は「differentThing」を使用しますが、コードに混乱が生じます。これを行うためのより良い方法はありますか、おそらく次のようなものがあります

if (thing instanceof ObjectType) {
    (ObjectType)thing; //this would declare 'thing' to be an instance of ObjectType
    thing.operation1();
    thing.operation2();
    thing.operation3();
}

この質問は過去に行われたことがあると確信していますが、見つかりませんでした。重複の可能性があることを私に指摘してください。

4

3 に答える 3

9

いいえ、変数が宣言されると、その変数の型は固定されます。変数の型を (潜在的に一時的に) 変更すると、以下よりもはるかに混乱を招くと思います。

ObjectType differentThing = (ObjectType)thing;

混乱を招くと思われるアプローチ。このアプローチは広く使用されており、慣用的です。(これは通常、少しコードのにおいがします。)

別のオプションは、メソッドを抽出することです。

if (thing instanceof ObjectType) {
    performOperations((ObjectType) thing);
}
...

private void performOperations(ObjectType thing) {
    thing.operation1();
    thing.operation2();
    thing.operation3();
}
于 2012-06-25T09:41:22.677 に答える
4

変数が宣言されると、その型は変更できません。あなたのdifferentThingアプローチは正しいものです:

if (thing instanceof ObjectType) {
    OjectType differentThing = (ObjectType)thing;
    differentThing.operation1();
    differentThing.operation2();
    differentThing.operation3();
}

differentThing変数のスコープがifオペレーターの本体に限定されている限り、何が起こっているのかは読者には明らかです。

于 2012-06-25T09:41:24.640 に答える
2

残念ながら、これは不可能です。

その理由は、このスコープ内の「もの」は常に同じオブジェクト タイプであり、コード ブロック内で再キャストできないためです。

2 つの変数名 (thing と castedThing など) が嫌いな場合は、いつでも別の関数を作成できます。

if (thing instanceof ObjectType) {
    processObjectType((ObjectType)thing);
}
..

private void processObjectType(ObjectType thing) {
    thing.operation1();
    thing.operation2();
    thing.operation3();
}
于 2012-06-25T09:46:05.337 に答える