这段代码:
class RawStringIterator {
        java.util.Stack<State> stateStack = new java.util.Stack<State>();
        RawStringIterator(RawStringIterator i) {
              stateStack = (java.util.Stack<State>) i.stateStack.clone();
        }
        /* ... */
}给我这样的警告:
Type safety: Unchecked cast from Object to Stack<Utils.OperatorTree.RawStringIterator.State>我想我可以忽略这里的警告。但我想知道一般情况下如何使用clone()?每次使用clone()时,我都必须使用@SuppressWarnings("unchecked")吗?或者我应该总是做完全多余的额外检查?
发布于 2010-10-15 19:44:35
如果可以选择,最好的办法是根本不实现/使用clone(),因为it is a broken API。只需实现/使用复制构造函数即可。
如果出于某些迫切的原因,您必须使用clone(),但可以更改其实现,请考虑声明Stack<T>.clone()以返回Stack<T>而不是Object -协变返回类型在Java5之后是合法的。
更新:如果有问题的Stack是java.util.Stack,请考虑使用its Javadoc
Deque接口及其实现提供了一组更完整和一致的后进先出堆栈操作,应该优先于此类使用
。
例如,ArrayDeque提供了copy constructor。
发布于 2010-10-15 19:45:13
这里是无法避免演员阵容的。clone()返回Object,如果是java.util.Stack,则不使用协变返回类型。
如果这不是java.util.Stack,那么就不要实现clone() --这真的很难让它正确。改为创建一个复制构造函数。
发布于 2010-10-15 19:44:26
你别无选择,只能忽略它。
虽然不是直接相关的(因为您不是在编写clone()方法),但Java Generics FAQ中的这个条目读起来很好(整个常见问题解答也是如此!)
https://stackoverflow.com/questions/3941850
复制相似问题