I am to adding genericity to one of my projects. I love generics as this makes my code more robust, self-documented and erases all those ugly casts.
However, I came across a tough case and have some issues trying to express a "recursive" constraint for one of my structures.
This is basically some kind of "generic" tree, with double links (to children and parent). I have simplified the class at maximum to show the issue :
public class GenericTree<
ParentClass extends GenericTree<?, ?>,
ChildClass extends GenericTree<?, ?>>
{
// Attributes
private ArrayList<ChildClass> children = new ArrayList<ChildClass>();
private ParentClass parent = null;
// Methods
public void setParent(ParentClass parent) {
this.parent = parent;
}
public void addChild(ChildClass child) {
child.setParent(this);
this.children.add(child);
}
}
The problem is for the instruction : child.setParent(this).
Java gives the following error :
Bound mismatch: The method setParent(?) of type ChildClass is not applicable for the
arguments (GenericTree). The wildcard parameter ? has no lower bound, and may actually be more restrictive than argument GenericTree
What I would like is to be able to express something like :
public class GenericTree<
ParentClass extends GenericTree<?, ?>,
ChildClass extends GenericTree<[THIS_VERY_CLASS], ?>>
To say that the parent class of the child class should be itself ...
I have looked at some articles about the self bounding generics, but I don't know how to apply it in this case.
Any help would be appreciated.
return (GenericTree<Type>)((GenericTree)obj);
NeedsSuppressWarning({"unsecure", "rawtypes"})
– Clubhouse