With the above method I am not able to access the methods of the XNode object but only for Node.

I want to keep the getNode(NodeType type) general so that when I create the nodes of a specific type it returns the child child of Node like XNode or YNode. Then I will be able to access specific operations possible all the way down to XNode.

Can I use generics here so that I don't return a general node type.

List<? extends Node> xNode = nodeManager.getNode(NodeType.X);

Does the list contain nodes of type XNode if getNode(NodeType.X) returns XNode?

I don't see the difference really. You still get a list of nodes that are of a type that is in the Node hierarchy, and because you wildcard it you don't know which one exactly. Nothing changes. Your code seems to include the possibility to make assumptions though; apparently you filter on a specific node type. So using the list returned you can make this assumption: