Michael Pradel created COLLECTIONS-424:
------------------------------------------

             Summary: Surprising exception by CompositeSet in a situation where 
CompositeCollection works fine
                 Key: COLLECTIONS-424
                 URL: https://issues.apache.org/jira/browse/COLLECTIONS-424
             Project: Commons Collections
          Issue Type: Bug
          Components: Set
    Affects Versions: 3.2.1
         Environment: All environments
            Reporter: Michael Pradel


We have a method that uses a CompositeCollection. Here's a simplified version 
of it:

  void m(CompositeCollection coll) {
    coll.addComposited(new TreeBag());
  }

It works fine when the argument is a CompositeCollection, but it throws an 
exception when the argument is a CompositeSet. E.g.:

  m(new CompositeCollection());  // OK
  m(new CompositeSet());         // IllegalArgumentException

Although the exception is documented in CompositeSet, this behavior is very 
surprising. Is there a way to have m() accept CompositeCollections without 
running into this exception? The only solution that comes to my mind is to 
dynamically check the type of 'coll' in m(), but this is a rather nasty 
work-around.


A better solution may be to make the genericity of CompositeCollection explicit 
by adding a type parameter:

  class CompositeCollection<T extends Collection> {
    void addComposited(T c) { /* .. */ }
  }
        
  class CompositeSet extends CompositeCollection<Set> {
    @Override void addComposited(Set c) { /* .. */ }
  }

This way, users of CompositeCollection must choose the kind of collections that 
can be composed and will not encounter surprises, such as the above.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to