Object oriented design for a Tree
Short answer: no.  

But you'll probably need some explanation to believe me.



The whole Node thing you got there should be internal information to the Tree class, not part of the type. Let's look at the following example method to show why it's a bad idea:  

private static void addARandomNumber(Tree&lt;Node&lt;Number&gt;&gt; tree) {
    int randomNumber = generateRandomNumber();
    Node&lt;Number&gt; = new ... ???
    tree.addNode(node);
}


What class should we use to create a new Node here?

Had the Node been completely internal to the Tree implementation then the interface would look like this:

interface Tree&lt;T&gt; {
    boolean add(T node);

    boolean remove(T node);

    String toString();
}


And now we can also write the add random number method easily:

private static void addARandomNumber(Tree&lt;Number&gt; tree) {
    int randomNumber = generateRandomNumber();
    tree.add(randomNumber);
}




I also got a feeling that forcing some ordering on T, as required in most search trees, will be rather hard in your current design. But that might just be because I didn't really try it myself yet.

Defining the type of the search tree correctly would probably work, but I expect some type erasure issues with the addNode and removeNode methods.