Java泛型:在复制子类的实例时捕获泛型类型



在下面的代码示例中,是否有一种方法可以避免难看的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) { }
}

您可以将类传递给方法,但这仍然很难看:

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的子类型(这就是为什么你的代码不是真正类型安全的)。

编辑:为什么你的代码不是真正的类型安全:想象一个扩展了A的类AA。如果你用这个类的实例调用你的方法,它将创建一个类型为A的对象,并尝试将其强制转换为AA

最新更新