首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java:如何使用clone()以及强制转换检查

java:如何使用clone()以及强制转换检查
EN

Stack Overflow用户
提问于 2010-10-15 19:39:06
回答 4查看 7.7K关注 0票数 4

这段代码:

代码语言:javascript
运行
复制
class RawStringIterator {
        java.util.Stack<State> stateStack = new java.util.Stack<State>();
        RawStringIterator(RawStringIterator i) {
              stateStack = (java.util.Stack<State>) i.stateStack.clone();
        }
        /* ... */
}

给我这样的警告:

代码语言:javascript
运行
复制
Type safety: Unchecked cast from Object to Stack<Utils.OperatorTree.RawStringIterator.State>

我想我可以忽略这里的警告。但我想知道一般情况下如何使用clone()?每次使用clone()时,我都必须使用@SuppressWarnings("unchecked")吗?或者我应该总是做完全多余的额外检查?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-15 19:44:35

如果可以选择,最好的办法是根本不实现/使用clone(),因为it is a broken API。只需实现/使用复制构造函数即可。

如果出于某些迫切的原因,您必须使用clone(),但可以更改其实现,请考虑声明Stack<T>.clone()以返回Stack<T>而不是Object -协变返回类型在Java5之后是合法的。

更新:如果有问题的Stackjava.util.Stack,请考虑使用its Javadoc

Deque接口及其实现提供了一组更完整和一致的后进先出堆栈操作,应该优先于此类使用

例如,ArrayDeque提供了copy constructor

票数 13
EN

Stack Overflow用户

发布于 2010-10-15 19:45:13

这里是无法避免演员阵容的。clone()返回Object,如果是java.util.Stack,则不使用协变返回类型。

如果这不是java.util.Stack,那么就不要实现clone() --这真的很难让它正确。改为创建一个复制构造函数。

票数 2
EN

Stack Overflow用户

发布于 2010-10-15 19:44:26

你别无选择,只能忽略它。

虽然不是直接相关的(因为您不是在编写clone()方法),但Java Generics FAQ中的这个条目读起来很好(整个常见问题解答也是如此!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3941850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档