Когда использовать <> и <E>- Java Generics - PullRequest
0 голосов
/ 26 декабря 2018

Это фрагмент кода из книги «Структуры данных и алгоритмы в Java (6-е изд.)» * Это пример метода клонирования реализации SinglyLinkedList.Чтобы лучше понять, я пишу это в Eclipse.

У меня два вопроса:

Во-первых, в строке 3 я получаю следующее предупреждение: Тип безопасности: "Не проверено приведение от объекта к SinglyLinkedList<E>".Почему это?

Во-вторых, в строке 5, почему у нас есть "new Node<>( ..." и почему бы не использовать "new Node<E>( ...", в чем разница между этими двумя?

public SinglyLinkedList<E> clone( ) throws CloneNotSupportedException { 
    //always use inherited Object.clone() to create the initial copy
    SinglyLinkedList<E> other = (SinglyLinkedList<E>) super.clone( ); //<---LINE 3 safecast

    if (size > 0) { // we need independent chain of nodes
        other.head = new Node<>(head.getElement( ), null);//<---LINE 5
        Node<E> walk = head.getNext( ); // walk through remainder of original list
        Node<E> otherTail = other.head; // remember most recently created node

        while (walk != null) { // make a new node storing same element
            Node<E> newest = new Node<>(walk.getElement( ), null);
            otherTail.setNext(newest); // link previous node to this one
            otherTail = newest;
            walk = walk.getNext( );
        } 
    } 
    return other;
}

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

1) Метод clone необходим для возврата Object см. Здесь , поэтому любое приведение не безопасно

2) other.head уже <E>, поэтому Вы не должны добавлять <E> к новому, компилятор уже знает тип универсального типа.

0 голосов
/ 26 декабря 2018

Во-первых, в строке 3 я получаю следующее предупреждение: Тип безопасности: «Не проверено приведение объекта от объекта к SinglyLinkedList».Почему это так?

Метод clone() возвращает Object, поэтому вы должны привести его к SinglyLinkedList, и компилятор не может гарантировать, что такой Object будетбудьте SinglyLinkedList, поэтому вы получите предупреждение.
Я предлагаю прочитать весь урок о Обобщения

Если вы хотите скрыть это предупреждение, вы можете использовать следующую аннотацию

@SuppressWarnings("unchecked")
public SinglyLinkedList<E> clone( ) throws CloneNotSupportedException { 

Во-вторых, в строке 5, почему у нас есть «новый узел <> (...» и почему не используется «новый узел (...»), в чем разница между этими двумя?

Начиная с Java7 вам не нужно указывать универсальный тип при вызове конструктора из-за Вывод типа для создания общего экземпляра .
Если вы написали = new Node(head.getElement( ), null); вы бы создали необработанный тип, теряя преимущества дженериков. Вы бы тоже получили предупреждение.
JLS - необработанный тип состояния:

Использование необработанноготипы допускаются только в качестве уступки совместимости устаревшего кода. Использование необработанных типов в коде написаноИттен после введения обобщений в язык программирования Java настоятельно не рекомендуется .Вполне возможно, что будущие версии языка программирования Java будут запрещать использование необработанных типов.

0 голосов
/ 26 декабря 2018

Строка 3:

Вы вводите тип super.clone(), который является объектом для SinglyLinkedList<E>.Предупреждение просто хочет, чтобы вы проверили, действительно ли super.clone() является экземпляром SinglyLinkedList<E>.Вы можете сделать это простым выбором:

if (super.clone() instanceof SinglyLinkedList<E>)
  SinglyLinkedList<E> other = (SinglyLinkedList<E>) super.clone();

Строка 5:

Ну, вы можете использовать new Node <E> вместо new Node<>.Там нет никаких различий.Проще говоря, компилятор уже знает тип универсального типа, который вы создадите, поэтому использование new Node <E> просто избыточно.Я не уверен, но я думаю, что вы должны использовать new Node <E> в предыдущих версиях Java (я думаю, Java 6 и ниже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...