Unchecked Cast предупреждение: приведение объекта к универсальному - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь реализовать DoublyLinkedList с обобщенными характеристиками. Согласно Java Docs , аргумент метода remove () должен быть Object.

Если я попытаюсь привести данные Object o к T, я получу предупреждение: Unchecked Cast: 'Java.lang.Object' to 'T'.

public boolean remove(Object o) {
        T data = (T) o; // warning here
...
}

Чтобы избежать этого, я должен подавить предупреждение с помощью "@SuppressWarning (" Unchecked ")"

@SuppressWarnings("unchecked")
public boolean remove(Object o) {
        T data = (T) o;
...
}

Насколько я понимаю, каждый T - это объект, но не каждый объект - это T. Именно поэтому он показывает предупреждение.

Но что, если, когда я использую свой класс DoublyLinkedList, я на 100% уверен, что аргумент Object является T, есть ли способ избежать предупреждения, или @suppresswarning - единственный выбор здесь?

Если мое предположение неверно, каков правильный способ приведения Объекта к T? Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Как отметили Сильвио и Андреас в комментариях.

Нет необходимости приводить Object к T, вместо этого нам просто нужно использовать .equals () для сравнения.

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

0 голосов
/ 28 мая 2019

Единственный способ избежать @SuppressWarning состоит в том, чтобы иметь поле, содержащее класс элемента:

public class DoublyLinkedList<T> ... {
    ...
    private final Class<T> elementClass;

    ...

    public DoublyLinkedList(Class<T> elementClass) {
        this.clazz = elementClass;
    }

    ...
    public boolean remove(Object o) {
        T data = elementClass.cast(o);
        ...
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...