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 回答