8

この質問で説明されている問題に直面していますが、すべてのキャストと @SuppressWarning アノテーションを使用せずに (可能であれば) 解決策を見つけたいと考えています。

より良い解決策は、参照されたものに基づいて次のように構築することです。

  • @SuppressWarning の削除
  • キャストの削除

ここに提示されたソリューションは、基準に基づいて 2 点で評価されます。報奨金は、最も多くのポイントを持つソリューション、または 2 ポイントのソリューションが複数ある場合は「最もエレガントな」ソリューションに進みます。

4

3 に答える 3

1

1 つの解決策は、子クラスのメソッドをオーバーライドし、戻り値の型をより具体的なものに変更することです。子供のタイプ。これにはキャストが必要です。(Child)典型的なキャストを使用する代わりに、Class#cast(Object)メソッドを使用します

public class Parent {
    public Parent example() {
        System.out.println(this.getClass().getCanonicalName());
        return this;
    }
}

public class Child extends Parent {
    public Child example() {
        return Child.class.cast(super.example());
    }

    public Child method() {
        return this;
    }
}

キャストは標準メソッド内に隠されています。のソースからClass

public T cast(Object obj) {
    if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj;
}
于 2013-08-22T15:17:09.180 に答える