Не проверено приведение при возврате нескольких общих классов - PullRequest
0 голосов
/ 28 ноября 2018

В моем коде я должен хранить коллекцию пар, оба из которых являются классами универсальных типов, которые содержат одинаковое возвращаемое значение универсального типа (GenericTypeA<T> и GenericTypeB<T>, где T всегда будет одинаковым в каждой паре)вот так:

private HashMap<GenericTypeA<T>, GenericTypeB<T>> myMap;

Конечно, я не могу объявить карту таким образом, так как она использует разные Ts для некоторых пар, поэтому я использовал:

private HashMap<GenericTypeA, GenericTypeB> myMap;

Учитываяобъект GenericTypeA<T>, мой код должен выполнять метод с использованием T на GenericTypeB<T>

public <T> void foo(GenericTypeA<T> key, T t){
    GenericTypeB<T> value = myMap.get(key);
    value.goo(t);
}

Я получаю unchecked assignment предупреждение в строке GenericTypeB<T> toResolve = myMap.get(key);, приведение значения в GenericTypeB<T>тоже не работает.Необходимо, чтобы значение было GenericTypeB<T>, поскольку его метод goo() получает (T t) в качестве параметра.

В любом случае я могу улучшить свой код без подавления предупреждений?

(используяJava, Intellij ide)

1 Ответ

0 голосов
/ 28 ноября 2018

где T всегда будет одинаковым в каждой паре

Система типов Java не достаточно выразительна, чтобы компилятор мог это знать, поэтому вам придется управлять этим фактомсебя.

Если вы правильно применили это ограничение в своем коде, нет ничего плохого в непроверенном приведении здесь.

В любом случае я могу улучшить свой код, не подавляя предупреждения?

Нет;и подавление предупреждений само по себе не является проблемой, при условии, что вы полностью понимаете, почему существует предупреждение .

Следуйте советам Эффективная Java и прокомментируйте подавление в документе. почему это безопасно, например:

@SuppressWarnings("unchecked")  // Safe because I make sure the Ts of key and value match.
GenericTypeB<T> value = (GenericTypeB<T>) myMap.get(key);

Обратите внимание, что вам не нужно явное приведение в коде, потому что вы используете необработанные типы.Не используйте вместо этого подстановочный знак:

private HashMap<GenericTypeA<?>, GenericTypeB<?>> myMap;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...