0

次のコード サンプルで、見苦しい SuppressWarnings 注釈を回避する方法はありますか?

このコードは、パラメーターtが A のインスタンスであるかどうかをテストし、そうである場合は A ののインスタンスを返します。これはcreateCopy()の一般的な規約を満たし、そのパラメーターと同じ型のオブジェクトを返すため、安全な操作です。同じことがBのテストにも当てはまります。

ワイルドカード キャプチャとヘルパー メソッドについては知っていますが、問題は非常に似ているように見えますが、それがこの状況で役立つかどうか、またどのように役立つかはわかりません。

abstract class Base {
    public static <T extends Base> T createCopy(T t) {
        if (t instanceof A) {
            @SuppressWarnings("unchecked")
            T copy = (T) new A((A) t);
            return copy;
        }

        if (t instanceof B) {
            @SuppressWarnings("unchecked")
            T copy = (T) new B((B) t);
            return copy;
        }

        throw new IllegalStateException();
    }
}

class A extends Base {
    public A() { }
    public A(A a) { }
}

class B extends Base {
    public B() { }
    public B(B b) { }
}
4

1 に答える 1

1

クラスをメソッドに渡すことはできますが、それはまだ醜いです:

abstract class Base {
    public static <T extends Base> T createCopy(final T t,
            final Class<T> klass) {
        if (t instanceof A) {
            final T copy = klass.cast(new A((A) t));
            return copy;
        }

        if (t instanceof B) {
            final T copy = klass.cast(new B((B) t));
            return copy;
        }

        throw new IllegalStateException();
    }
}

class A extends Base {
    public A() {
    }

    public A(final A a) {
    }
}

class B extends Base {
    public B() {
    }

    public B(final B b) {
    }
}

通話t.getClass()もダメ。その理由は、T が A または B のサブタイプになる可能性があるためです (そのため、コードは実際には型安全ではありません)。

編集:コードが実際に型安全ではない理由:AAを拡張するクラスを想像してくださいA。このクラスのインスタンスでメソッドを呼び出すと、タイプのオブジェクトが作成され、それがAにキャストされAAます。

于 2013-04-05T13:08:01.187 に答える