Re: Generics, extending LinkedList<T>, and unchecked casts
On Wed, 27 Dec 2006 23:29:29 -0000, Mark Maloof <maloof@cs.georgetown.ed=
u> =
wrote:
I need an ordered sequence, so I extended LinkedList<T>. Since I'm
implementing an ordered collection, its elements must implement
Comparable<T>. I came up with the following implementation, which
seems to work, but I cannot figure out how to avoid the unchecked cast=
at the end of the insert method:
public class OrderedLinkedList<E> extends LinkedList<E> {
public void insert( Comparable<E> element ) {
int i = 0;
while ( i < size() && element.compareTo( this.get( i ) ) >= 0 ) =
{
i++;
} // while
// add( i, element ); // compiler error
add( i, (E) element ); // unchecked cast
} // OrderedLinkedList::add
public static void main ( String args[] ) {
OrderedLinkedList<String> oll = new OrderedLinkedList<String>();=
oll.insert("cat");
oll.insert("pig");
oll.insert("dog");
oll.insert("hog");
System.out.println( oll );
} // OrderedLinkedList::main
} // OrderedLinkedList class
A class that implements Comparable<E> is not itself necessarily assignab=
le =
to references of type E, it just means it can be compared with instances=
=
of E.
If you don't need duplicates you could just use a SortedSet. If you do =
=
need to deal with duplicates, you could try this:
public class SortedList<E extends Comparable<E>> extends LinkedList<E>
This means you can only use the list with types that are comparable to =
themselves.
The other option you have is to follow the TreeSet way of doing things a=
nd =
drop the requirement for Comparable and allow a Comparator to be specifi=
ed.
Also, OrderedList is a bad name, lists are, by definition, ordered. =
SortedList might be a better name, at least it will be consistent with =
java.util.SortedSet then.
Dan.
-- =
Daniel Dyer
https://watchmaker.dev.java.net - Evolutionary Algorithm Framework for J=
ava