Хорошей ли практикой является замена Class на Class<?расширяет Object>, чтобы избежать предупреждений?

StackOverflow https://stackoverflow.com/questions/370601

Вопрос

В нескольких местах моего кода у меня есть что-то вроде этого:

public Class mySpecialMethod() {
  return MySpecialClass.class;
}

что вызывает предупреждение

Класс — это необработанный тип.Ссылки на класс общего типа должны быть параметризованы.

Но если я заменю

Class

с

Class<? extends Object>

предупреждение исчезнет.

Подходит ли эта простая практика, или она может вызвать проблемы позже?

Это было полезно?

Решение

Это правильно, только если на самом деле не существует общего базового класса или интерфейса, который должен представлять объект Class.

Также Class<?> фактически то же самое, что и Class<? extends Object>.

Другие советы

Да, это совершенно верно.

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

Дальнейшее чтение: Спецификация языка Java:Параметризованные типы

В зависимости от того, чего вы хотите достичь, вы можете быть еще точнее:

public Class<MySpecialClass> mySpecialMethod() {
  return MySpecialClass.class;
}

Я здесь не совсем Java-программист, но прочитал несколько хороших статей о дженериках.

Да, вам следует добавить подстановочный знак или точный тип (Class<MySpecialClass>) для повышения безопасности.Причина в том, что Class является универсальным.Так, Class<Bar> и Class<Foo> остаются теми же после стирания их параметра универсального типа.Они все становятся Class, так называемый необработанный тип.Это стирание происходит при компиляции.Несколько примеров, иллюстрирующих это, где компилятор помогает вам с автоматическим приведением типов (обработка исключений опущена для краткости):

class Mine { }

class Vara {
    public static void main(String... args) {
        { // works. translated to Mine m = (Mine) c.newInstance();
            Class<Mine> c = Mine.class;
            Mine m = c.newInstance();
        }
        { // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
            Class c = Mine.class; // also Class<?> or Class<? extends Object>
            Object o = c.newInstance(); // but this works. pointing to a Mine
            Mine m = (Mine) c.newInstance(); // needs a manual cast
        }
    }
}

Говоря Class<?> (и эквивалент Class<? extends Object>), вы сообщаете компилятору, что вам действительно нужен класс, T является Object и не случайно использовал необработанный тип.Но удобства забросов это не добавит.Все, что делают дженерики, это вставляют за вас автоматические приведения, для приведения из Object к типу назначения.Обобщенные шаблоны одинаковы независимо от того, используются ли они с типом U или с типом T во время выполнения из соображений совместимости со старыми версиями Java.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top