This code:
class RawStringIterator {
java.util.Stack<State> stateStack = new java.util.Stack<State>();
RawStringIterator(RawStringIterator i) {
stateStack = (java.util.Stack<State>) i.stateStack.clone();
}
/* ... */
}
gives me this warning:
Type safety: Unchecked cast from Object to Stack<Utils.OperatorTree.RawStringIterator.State>
I guess I can ignore the warning here. But I wonder about how to use clone()
in general? Do I always have to use a @SuppressWarnings("unchecked")
every time I use clone()
? Or should I always do the completely redundant extra check?
If you have the choice, the best is not to implement / use
clone()
at all, because it is a broken API. Just implement / use a copy constructor instead.If for some pressing reason you must use
clone()
but can change its implementation, consider declaringStack<T>.clone()
to returnStack<T>
instead ofObject
- covariant return types are legal since Java5.Update: if the
Stack
in question isjava.util.Stack
, consider its Javadoc:And e.g.
ArrayDeque
provides a copy constructor.There is no way to avoid the cast here.
clone()
returnsObject
, if it isjava.util.Stack
, it is not making use of co-variant return types.If this is not
java.util.Stack
, then don't implementclone()
- it's really hard to get it right. Make a copy-constructor instead.Yes, you'll need to explicitly suppress the warnings each time you use
clone()
.This is one of the reasons you might prefer to use copy constructors instead of
clone()
, if available.By the way in your code, when the
RawStringIterator(RawStringIterator i)
constructor is used, the first initialisation ofstateStack
is unnecessary:You might want to remove that.
You have very little choice but to ignore it.
Whilst not directly relevant (because you're not writing a
clone()
method), this entry in the Java Generics FAQ makes good reading (as does the whole FAQ!)