java:如何使用clone()以及如何使用cast检查

Alb*_*ert 4 java clone compiler-warnings

这段代码:

class RawStringIterator {
        java.util.Stack<State> stateStack = new java.util.Stack<State>();
        RawStringIterator(RawStringIterator i) {
              stateStack = (java.util.Stack<State>) i.stateStack.clone();
        }
        /* ... */
}
Run Code Online (Sandbox Code Playgroud)

给了我这个警告:

Type safety: Unchecked cast from Object to Stack<Utils.OperatorTree.RawStringIterator.State>
Run Code Online (Sandbox Code Playgroud)

我想我可以忽略这里的警告.但我想知道如何使用clone()一般?@SuppressWarnings("unchecked")每次使用时我总是要使用clone()吗?或者我应该总是进行完全冗余的额外检查吗?

Pét*_*rök 12

如果你有选择,最好不要实现/使用clone(),因为它是一个破坏的API.只需实现/使用复制构造函数.

如果由于某些紧迫的原因你必须使用clone()但可以改变它的实现,考虑声明Stack<T>.clone()返回Stack<T>而不是Object- 协变返回类型是合法的,因为Java5.

更新:如果Stack问题是java.util.Stack,请考虑其Javadoc:

Deque接口及其实现提供了更完整和一致的LIFO堆栈操作集,应该优先使用该类.

并且例如ArrayDeque提供了复制构造函数.