Рассмотрим следующий метод API, взятый из интерфейса Shiro org.apache.shiro.subject.PrincipalCollection
но, вероятно, присутствующий и в других библиотеках:
Collection fromRealm(String realmName);
Да, даже в наши дни все еще существуют библиотеки, использующие raw-типы, возможно, для сохранения совместимости до Java 1.5?!
Если я сейчас хочу использовать этот метод вместе с потоками или дополнительными функциями, как это:
principals.fromRealm(realmName).stream().collect(Collectors.toSet());
Я получаю предупреждение о неконтролируемой конвертации и использовании необработанных типов, и что я предпочитаю использовать параметризованные типы.
Затмение:
Тип безопасности: метод collect (Collector) относится к необработанному типу Stream. Ссылки на универсальный тип Stream <T> должны быть параметризованы
Javac:
Примечание. GenericsTest.java использует непроверенные или небезопасные операции.
Поскольку я не могу изменить сигнатуру метода API, чтобы избавиться от этого предупреждения, я могу либо аннотировать с помощью @SuppressWarnings("unchecked")
либо просто привести к Collection<?>
@SuppressWarnings("unchecked")
образом:
((Collection<?>) principals.fromRealm(realmName)).stream().collect(Collectors.toSet());
Поскольку этот набор, конечно, всегда работает, мне интересно, почему компиляторы не просто обрабатывают Collection
как Collection<?>
Но предупреждают об этой ситуации. Добавление аннотации или приведений не улучшает код на один бит, но снижает читаемость или может даже скрывать действительные действительные предупреждения об использовании непараметризованных типов.