Re: Destructively merging two LinkedLists
On 1/10/2011 9:26 AM, Joshua Cranmer wrote:
On 01/10/2011 09:14 AM, Eric Sosman wrote:
class RaphfrkList<T> extends AbstractSequentialList<T> {
boolean stealAll(RaphfrkList<? extends T> from) {
// O(1) magic here ...
}
boolean stealAll(Collection<? extends T> from) {
if (from instanceof RaphfrkList)
return stealAll((RaphfrkList)from);
boolean result = addAll(from);
from.clear();
return result;
}
// ...
}
Java does not do dynamic dispatch based on real types of arguments.
True, if he uses a List (or Queue or Collection or ...) reference
to point to a RaphfrkList object, he'll get the vanilla stealAll().
but if he uses a RaphfrkList reference
RaphfrkList listA = new RaphfrkList();
RaphfrkList listB = new RaphfrkList();
// ...
listA.stealAll(listB);
.... then he'll get the specialized version. (The usual advice to use
interface references in preference to implementation references can
be disregarded, I think, in cases where an implementation-specific
functionality is desired.)
Alternatively, he could decorate the vanilla method:
boolean stealAll(Collection<? extends T> from) {
if (from instanceof RaphfrkList)
return stealAll( (RaphfrkList<? extends T>)from );
//...
}
(Double-check the cast; I'm not at all sure I wrote it correctly.)
--
Eric Sosman
esosman@ieee-dot-org.invalid