Параметры типа записи в внутреннем классе Java

В чем разница между выполнением

public class BST<Key extends Comparable<Key>, Value> {

    public class Node<Key, Value> {
       Key key;
       Value val;
    }
}

и делая

public class BST<Key extends Comparable<Key>, Value> {

    public class Node {
       Key key;
       Value val;
    }
}

то есть. введите параметры типа для внутреннего класса? Какая реализация лучше?

Ответ 1

Кажется, вы думаете, что эти два эквивалента - это не так. В верхнем примере объявляются два общих класса, нижний пример объявляет один общий класс и один не общий общий класс.

Например, в верхней декларации вы можете создать такой экземпляр...

BST<MyComparable, String>.Node<Integer, Boolean> x = new ...

... потому что параметры типа различны между двумя классами - вы только что выбрали, чтобы дать внутренним типичным параметрам типа то же имя, что и параметры типа во внешнем классе, но они не связаны.

Если вы попытаетесь сделать это во втором примере, вы получите сообщение об ошибке, потому что внутренний класс Node не является общим. Во втором примере типы полей Node должны соответствовать внешним параметрам типа.