Ответ 1
Кажется, вы думаете, что эти два эквивалента - это не так. В верхнем примере объявляются два общих класса, нижний пример объявляет один общий класс и один не общий общий класс.
Например, в верхней декларации вы можете создать такой экземпляр...
BST<MyComparable, String>.Node<Integer, Boolean> x = new ...
... потому что параметры типа различны между двумя классами - вы только что выбрали, чтобы дать внутренним типичным параметрам типа то же имя, что и параметры типа во внешнем классе, но они не связаны.
Если вы попытаетесь сделать это во втором примере, вы получите сообщение об ошибке, потому что внутренний класс Node
не является общим. Во втором примере типы полей Node
должны соответствовать внешним параметрам типа.