You need to read a little more about generics. This is one of the first major hurdles you run into using them.
Yes, Node is a superclass of HiddenNode.
ArrayList<Node> is NOT a superclass of ArrayList<HiddenNode>.
I know it makes sense that it is, but it is not. The fact that it is not was easier for me to understand after I learned that all this lovely type-checking information we write all those angle-brackets for is NOT available at runtime --
Java checks these things at compile time, and boils them all down to their most generic form at runtime.
Therefore, as far as the runtime is concerned, you can put any subclass of Node into ArrayList<Node>, and that makes it unsuitable for holding any specific subclass of node.
You can read about having an ArrayList<? extends Node>, which may be the closest thing to what you want. It will not, however, check that only one subclass of node is going into the list declared that way. If you really want to do that, you're going to have to declare one ArrayList for each subtype.
rc