I'll to suggest the following improvement (generics)
Today:
protected List<IBehavior> getBehvavior(Class<? extends IBehavior> type)
Which leads to code like WindowClosedBehavior behavior =
(WindowClosedBehavior)getBehaviors(WindowClosedBehavior.class).get(0);
Though we provide the type as parameter, we still have to cast the return value
That can improved as follows
protected <M extends IBehavior> List<M> getBehaviors(Class<M> type)
which than allows for (no more extra casting)
WindowClosedBehavior behavior = getBehaviors(WindowClosedBehavior.class).get(0);
Regarding the implemention nothing changes except for types
@SuppressWarnings("unchecked")
protected <M extends IBehavior> List<M> getBehaviors(Class<M> type)
{
List<IBehavior> behaviors = getBehaviorsRawList();
if (behaviors == null)
{
return Collections.emptyList();
}
List<M> subset = new ArrayList<M>(behaviors.size()); // avoid
growing
for (Iterator<IBehavior> i = behaviors.iterator(); i.hasNext();)
{
Object behavior = i.next();
if (behavior != null && (type == null ||
type.isAssignableFrom(behavior.getClass())))
{
subset.add((M)behavior);
}
}
return Collections.unmodifiableList(subset);
}
Making that change didn't require any other change to any other Wicket
code incl tests
Any objections?
Juergen