[jdom-interest] JDom and Java5

Victor Toni victor.toni at ebuconnect.de
Mon Feb 25 06:15:24 PST 2008


I wonder why this couldn't be rewritten to :

  public <T> List<T> selectNodes(Object context) throws JDOMException {
     try {
        currentContext = context;
        return xPath.selectNodes(context);
     } catch (JaxenException ex1) {
        throw new JDOMException("XPath error while evaluating \"" + 
xPath.toString() + "\": " + ex1.getMessage(), ex1);
     } finally {
        currentContext = null;
     }
  }

which would leave it to the user of what kind the result would be or if 
he wants to use generics at all.

The only issue I see here is that one cannot use something like:

for (Element element : selectNodes(context)) {
    ....
}

directly because the compiler does not support it. One has to use

List<Element> elements = selectNodes(context);
for (Element element : elements) {
    ....
}

to make it work

Rolf wrote:
> Hi Gregor
>
> Hmm... actually, I somewhat disagree (in this particular 
> circumstance). I have been thinking about this a bit more
>
> Here's the 'current' code behind the method (after I modified it 
> yesterday)...
>
>   public List<?> selectNodes(Object context) throws JDOMException {
>      try {
>         currentContext = context;
>         return xPath.selectNodes(context);
>      } catch (JaxenException ex1) {
>         throw new JDOMException("XPath error while evaluating \"" + 
> xPath.toString() + "\": " + ex1.getMessage(), ex1);
>      } finally {
>         currentContext = null;
>      }
>   }
>
> Here's the signature on the xPath method that is supplied by Jaxen:
>
> List <http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html> 
> *selectNodes*(Object 
> <http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html> 
> context) throws JaxenException 
> <http://jaxen.codehaus.org/apidocs/org/jaxen/JaxenException.html>
>
> Given that XPath can return all sorts of values (not all of them are 
> JDom Content (like Attribute which is not Content)), then we have a 
> real problem with this method.
>
> There is no way I can see (even by modifying Jaxen) to return a list 
> of any specific type other than Object. It would be real nice if an 
> xpath that returned just Elements would have a return type of 
> List<Element>, but that just isn't feasible.
>
> The next best thing is to return something appropriate, and that 
> should be the same as what Jaxen would return if it were Generified.
>
> Thus, the best thing would be to consider things from Jaxen's POV, and 
> let the 'client' sort it out.
>
> Since Jaxen does not know anything about the actual content in the 
> 'context' (it is all delegated to a JDom specific implementation), and 
> that implementation has to be able to return both Attribute and 
> Content, the best that Jaxen could do is return List<Object>.
>
> The Jaxen code would have no option but to look something like:
>
> List<Object> ret = new XXXList<Object>();
> for (..... nodes in context ...) {
>  if (... node matches the xpath ...) {
>     ret.add(node);
>  }
> }
>
>
> because it will potentially have to add Attributes, Elements, Text, 
> etc. (and that's just for JDom, for other API's it will need other 
> constructs).
>
> As a consequence, the Jaxen code, if it were Generified, would have no 
> option but to return List<Object> from the method, just like it 
> returns Object from the method selectSingleNode();
>
> Object <http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html> 
> *selectSingleNode*(Object 
> <http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html> 
> context) throws JaxenException 
> <http://jaxen.codehaus.org/apidocs/org/jaxen/JaxenException.html>
>
> In other words, I have come back around the circle and I believe that 
> the method should return exactly List<Object> rather than List<?> or 
> List<? extends Object>.
>
> As further considerations against the alternatives:
>
> returning List<? extends Object> implies that the actual returned list 
> may be any other specific type as well, e.g. List<String> or 
> List<Element> or even something silly like List<System>. This will not 
> be the case, the actual returned type will in fact be List<Object> and 
> there is no point in making it more obscure by saying List<? extends 
> Object> because that actually reduces the meaning.
>
> returning List<?> implies that we have no idea what's in the list, but 
> we do.
>
> The logical answer appears to be returning List<Object>. This makes 
> the most sense until Jaxen finds a way for the method 
> returnSingleNode(Context) to return a type other than Object. Here's 
> the Jaxen code:
>
>    public Object selectSingleNode(Object node) throws JaxenException {
>        List results = selectNodes( node );
>        if ( results.isEmpty() ) {
>            return null;
>        }
>        return results.get( 0 );
>    }
>
> If Jaxen can be generified to have something like:
>
>    public T <T extends Object> selectSingleNode(Object node) throws 
> JaxenException {
>        List<T> results = selectNodes( node );
>        if ( results.isEmpty() ) {
>            return null;
>        }
>        return results.get( 0 );
>    }
>
> only then should we consider the alternatives....
>
> On the other hand, the client-side code calling the XPath method is 
> going to have to jump through all sorts of instanceof hoops anyways, 
> and the return type does not really affect that in any way.
>
> As for Mattias's original claim that List<?> can be cast to 
> List<Element> if you know the content will be only Elements, then, I 
> believe that lends a certain weight to List<?>, but, is the same not 
> true for List<Object>? At some point you will have a compile-time 
> warning about unchecked types... unless you do individual casts to 
> Element on the contents of the List anyway.
>
> Does this make sense? This whole topic is somewhat interesting, and I 
> do see the value in different implementations. There appears to be 
> more than one right answer, all with different compromises. At the 
> moment I am more in the List<Object> camp but am willing to be 
> convinced otherwise....
>
> Rolf
>
> Gregor Zeitlinger wrote:
>> I think List<? extends Object> is more appropriate.
>>
>> It shows that the code has been generified (as opposed to using a 
>> plain List).
>> It's similiar to List<?>, but shows that Object is indeed the least
>> common denomiator.
>> _______________________________________________
>> To control your jdom-interest membership:
>> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>>
>>   
>
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com


-- 
Victor Toni
Senior Software Architect
    
Phone:  +49 203  9414768
Office: +49 2181 2363-0
Fax:    +49 2181 2363-43
Mobile: +49 160  8511835

Web: www.ebuconnect.de
Mail: victor.toni at ebuconnect.de

Sitz der Gesellschaft: ebuconnect AG, Stadttor 1, D-40219 Düsseldorf Amtsgericht Düsseldorf: HRB 40219
Vorstand: Andreas Weiss - Vorsitzender
Vorsitzender des Aufsichtsrates: Dr. Marc Henze



More information about the jdom-interest mailing list