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

时间:2013-04-05 12:46:27

标签: java generics

在下面的代码示例中,有没有办法避免丑陋的SuppressWarnings注释?

代码测试参数 t A 的实例,如果是,则返回 A 的另一个实例。这满足了 createCopy()的一般契约,以返回与其参数相同类型的对象,因此它是一个安全的操作。 B 的测试也是如此。

我知道Wildcard Capture and Helper Methods但我不确定在这种情况下是否以及如何帮助,尽管问题看起来非常相似。

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) { }
}

1 个答案:

答案 0 :(得分: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