Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: (Обновленные) Обобщения
Раздел: Универсальные Типы
Необработанные Типы
Домашняя страница > Изучение Языка Java > (Обновленные) обобщения

Необработанные Типы

Необработанный тип является именем универсального class или интерфейса без любых параметров типа. Например, учитывая универсальный Box class:

public class Box<T> {
    public void set(T t) { /* ... */ }
    // ...
}

Чтобы создать параметризованный тип Box<T>, Вы предоставляете фактический параметр типа за формальный параметр типа T:

Box<Integer> intBox = new Box<>();

Если фактический параметр типа опускается, Вы создаете необработанный тип Box<T>:

Box rawBox = new Box();

Поэтому, Box является необработанным типом универсального типа Box<T>. Однако, неуниверсальный тип class или интерфейса не является необработанным типом.

Необработанные типы обнаруживаются в коде наследства, потому что много классов API (таких как классы Collections) не было универсально до JDK 5.0. При использовании необработанных типов Вы по существу получаете поведение перед обобщениями — Box дает Вам Object s. Для обратной совместимости, присваивая параметризованный тип его необработанному типу позволяется:

Box<String> stringBox = new Box<>();
Box rawBox = stringBox;               // OK

Но если Вы присваиваете необработанный тип параметризованному типу, Вы получаете предупреждение:

Box rawBox = new Box();           // rawBox is a raw type of Box<T>
Box<Integer> intBox = rawBox;     // warning: unchecked conversion

Вы также получаете предупреждение, если Вы используете необработанный тип, чтобы вызвать универсальные методы, определенные в соответствующем универсальном типе:

Box<String> stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8);  // warning: unchecked invocation to set(T)

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

У раздела Стирания Типа есть больше информации о том, как компилятор Java использует необработанные типы.

Сообщения об ошибках непроверенные

Как упомянуто ранее, когда смешивание наследства кодирует с универсальным кодом, можно встретиться с предупреждающими сообщениями, подобными следующему:

Note: Example.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Это может произойти при использовании более старого API, который работает на необработанных типах, как показано в следующем примере:

public class WarningDemo {
    public static void main(String[] args){
        Box<Integer> bi;
        bi = createBox();
    }

    static Box createBox(){
        return new Box();
    }
}

Термин "непроверенный" означает, что у компилятора нет достаточной информации о типе, чтобы выполнить все проверки типа, необходимые, чтобы гарантировать безопасность типов. Предупреждение "непроверенное" отключается, по умолчанию, хотя компилятор дает подсказку. Чтобы видеть все предупреждения "непроверенные", перекомпилируйте с -Xlint:unchecked.

Перекомпиляция предыдущего примера с -Xlint:unchecked показывает следующую дополнительную информацию:

WarningDemo.java:4: warning: [unchecked] unchecked conversion
found   : Box
required: Box<java.lang.Integer>
        bi = createBox();
                      ^
1 warning

Чтобы полностью отключить предупреждения непроверенные, используйте флаг -Xlint:-unchecked. Аннотация @SuppressWarnings("unchecked") подавляет предупреждения непроверенные. Если Вы незнакомы с @SuppressWarnings синтаксис, см. Аннотации.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Универсальные Типы
Следующая страница: Универсальные Методы