小编典典

关于可复制的getObjectCopy(),如何证明未经检查的强制转换为什么可行

java

我有一个名为的接口Copyable,该接口具有一个功能

Copyable getObjectCopy();

许多其他类都使用此方法。由于此函数始终返回a Copyable,因此将导致未经检查的强制转换。例:

@SuppressWarnings("unchecked")  //Copy of itself is the same type.
ValidateValue<L> vvo = (ValidateValue<O>)this_toCopy.getValidator().getObjectCopy();
vvBlkA = vvo;

我的问题与乔什·布洛赫(Josh Bloch)的建议有关(《有效的Java》,第二版,第24项):

每次使用@SuppressWarnings(“ unchecked”)批注时,都添加一条注释,说明这样做安全的原因。

他的例子是

// This cast is correct because the array we're creating
// is of the same type as the one passed in, which is T[].
@SuppressWarnings("unchecked")
T[] result = (T[]) Arrays.copyOf(elements, size, a.getClass());
return  result;

(请参阅第9/117页的底部:http//www.infoq.com/resource/articles/bloch-
effective-
java-2e/en/resources/Bloch_Ch05.pdf)

我喜欢这个主意,并希望与 getObjectCopy()

@SuppressWarnings("unchecked")  //Copy of itself is the same type.
ValidateValue<L> vvo = (ValidateValue<O>)this_toCopy.getValidator().getObjectCopy();
vvBlkA = vvo;

我的评论似乎有些la脚,但我想不出更好的办法。那就是我的问题: 为什么这种未经检查的铸造是合理的
?什么是有意义的评论,实际上将对未来的开发人员有所帮助,这意味着比实际上“仅仅相信我”还重要。


阅读 222

收藏
2020-11-26

共1个答案

小编典典

我们现在处在Java 5+世界中!用户通用。

您可以将的签名更改为Copyable

interface Copyable<T extends Copyable> {
    T getObjectCopy();
}

现在,您的ValidateValue<L>价值将类似于:

puvlic class ValidateValue<L> implements Copyable<ValidateValue<L>> {
    ...
}

每个人(包括编译器)都会很高兴!

2020-11-26