В чем разница между общим узлом и узлом объекта - PullRequest
1 голос
/ 10 марта 2019

Вот внутренний класс Node моего связанного класса.

    private class Node{
    private Node next;
    private T value;

    public Node (T value,Node next){
      this.next=next;
      this.value=value;
    }
}

Если я поменяю это так.

    private class Node<T>{
    private Node <T> next;
    private T value;

    public Node (T value,Node<T> next){
      this.next=next;
      this.value=value;
    }
}

Что происходит и какую мне использовать? Я думаю, что Node всегда объект, поэтому нам не нужно использовать его с общими типами данных. Любой момент, который я пропустил?

1 Ответ

0 голосов
/ 10 марта 2019

Из вашего вопроса я понимаю, что ваш код выглядит примерно так

public class LinkedList<T> {
    .
    .
    .

    public class Node{
        .
        .
        .
        }
    }

Тогда вам следует перейти на

private class Node{
    private Node next;
    private T value;

    public Node (T value,Node next){
        this.next=next;
        this.value=value;
    }
}

, а не на другой.Причина в том, что когда вы используете вышеуказанную версию, T в обоих классах ссылается на аргумент типа, предоставленный при определении объекта, то есть

LinkedList<String> list; // here String is the type argument for both LinkedList and Node

, и вы можете просто создать объекты Node

Node someNode=...

Следовательно, во время компиляции компилятор будет гарантировать, что в Node.value сохраняются только строковые значения.

Если вы вместо этогоперейдите к другому методу, т.е. Node<T>, тогда всякий раз, когда вы создаете объекты типа Node, вам снова придется набирать его, кодируя

Node<T> someNode = new .. // notice the additional type arguments

Это загромождает ваш код ипобить основную цель дженериков.

...