在下面的代码示例中,有没有办法避免丑陋的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) { }
}
答案 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
。