[jdom-interest] How will JDOM be updated for Java Generics (JDK 1.5)?

Geoff Rimmer geoff.rimmer at sillyfish.com
Fri Jul 19 05:29:24 PDT 2002

Generics are due to be added to the Java language in JDK 1.5 to
provide better compile-time type safety.

For example if you had a list of Element objects, then instead of
writing code like this:

    Element rootElement = new SAXBuilder().build( ... ).getRootElement();

    List elementList = rootElement.getChildren( "person" );
    for ( Iterator iter1 = elementList.iterator(); iter1.hasNext(); )
        Element e = (Element)iter1.next();

        List attributes = e.getAttributes();
        for ( Iterator iter2 = attributes.iterator(); iter2.hasNext(); )
            Attribute attr = (Attribute)iter2.next();
            System.out.println( attr.getName() + " = " + attr.getValue() );

you could write:

    Element rootElement = new SAXBuilder().build( ... ).getRootElement();

    List<Element> elementList = rootElement.getChildren( "person" );
    for ( Iterator<Element> iter1 = elementList.iterator(); iter1.hasNext(); )
        Element e = iter1.next();

        List<Attribute> attributes = e.getAttributes();
        for ( Iterator<Attribute> iter2 = attributes.iterator();
                  iter2.hasNext(); )
            Attribute attr = iter2.next();
            System.out.println( attr.getName() + " = " + attr.getValue() );

Some JDOM changes would be trivial (for example a few changes from
List to List<Attribute>), but others would require a bit of work.

For example, Element.getChildren() currently returns a List.  As this
is always a List of Element objects, this should ideally be changed to
List<Element>.  But the way the method is implemented (in b8) would
not allow this:

    public List getChildren()
        return content.getView(new ElementFilter());

since content.getView() can, depending on what filter is passed to it,
return a List of other types (e.g. Text) as well.

Also, Element.getContent() returns a List whose entries can be of any
of the following types: Text, Element, Comment, ProcessingInstruction,
CDATA, and EntityRef.

There's not a lot of point having Element.getContent() returning a
List<Object>, so I would suggest that this would be the ideal excuse
to introduce an interface Node which all of the above types would

Then, Element.getContent() can look like this:

    public List<Node> getContent()

It is not necessary to wait for JDK 1.5 before making any JDOM
changes: they could be made now by using the Sun prototype Generics


and what's more, the .class files generated by this compiler are
compatible with current JDK 1.3 and 1.4 JVMs.

Geoff Rimmer <> geoff.rimmer at sillyfish.com <> www.sillyfish.com
www.sillyfish.com/phone - Make savings on your BT and Telewest phone calls
UPDATED 07/06/2002: 521 destinations, 14 schemes (incl. 10p/min to mobiles)

More information about the jdom-interest mailing list