This came up recently:
- Generic implementation doesn't work with concrete types - #6 by Slava_Pestov
- Nested types don't recognize protocol conformance in recursive methods - #6 by Slava_Pestov
Just like in Java and C++, you need to use the "double dispatch" pattern to accomplish this sort of thing: Double dispatch - Wikipedia