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