Рубрики
Без рубрики

Необработанные типы в Java

Почему необработанные типы проблематичны? Узнайте, как и что с этим делать.

Автор оригинала: Nikunj Gandhi.

1. введение

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

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

Необработанный тип – это имя универсального интерфейса или класса без аргумента типа:

List list = new ArrayList(); // raw type

Вместо:

List listIntgrs = new ArrayList<>(); // parameterized type

List является параметризованным типом интерфейса List в то время как List является необработанным типом интерфейса List .

Необработанные типы могут быть полезны при взаимодействии с неродовым унаследованным кодом.

В противном случае, однако, это обескураживает. Это потому, что:

  1. Они не выразительны
  2. Им не хватает безопасности типа, и
  3. Проблемы наблюдаются во время выполнения, а не во время компиляции

3. Невыразительный

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

Мы можем легко сделать вывод, что параметризованный тип List – это список, содержащий String s. Однако необработанному типу не хватает этой ясности, что затрудняет работу с ним и его методами API.

Давайте посмотрим сигнатуру метода get(int index) в интерфейсе List , чтобы лучше понять это:

/**
 * Returns the element at the specified position in this list.
 *
 * @param index index of the element to return
 * @return the element at the specified position in this list
 * @throws IndexOutOfBoundsException if the index is out of range
 *         (index < 0 || index >= size())
 */
E get(int index);

Метод get(int index) возвращает Строку в позиции index в параметризованном типе List .

Однако для необработанного типа List он возвращает Объект . Таким образом, мы должны приложить дополнительные усилия, чтобы проверить и определить тип элемента в необработанном типе List и добавить соответствующее приведение типов. Это может привести к ошибкам во время выполнения, так как необработанный тип не безопасен для типов .

4. Не Типобезопасно

Мы получаем предгенерированное поведение с необработанными типами. Таким образом, необработанный тип Список принимает Объект и может содержать элемент любого типа данных . Это может привести к проблемам безопасности типов, когда мы смешиваем параметризованные и необработанные типы.

Давайте посмотрим на это, создав некоторый код, который создает экземпляр List перед передачей его методу, который принимает необработанный тип List и добавляет к нему Целое число :

public void methodA() {
    List parameterizedList = new ArrayList<>();
    parameterizedList.add("Hello Folks");
    methodB(parameterizedList);
}

public void methodB(List rawList) { // raw type!
    rawList.add(1);
}

Код компилируется (с предупреждением), и Integer добавляется в необработанный тип List при выполнении. List , который был передан в качестве аргумента , теперь содержит Строку и Целое число .

Компилятор выводит предупреждение из – за использования необработанных типов:

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

5. Проблемы во время выполнения

Отсутствие безопасности типов в необработанном типе имеет причинно-следственные последствия, которые могут привести к исключениям во время выполнения.

Давайте изменим предыдущий пример так, чтобы method получал элемент в позиции индекса 1 нашего List после вызова Method/|:

public void methodA() {
    List parameterizedList = new ArrayList<>();
    parameterizedList.add("Hello Folks");
    methodB(parameterizedList);
    String s = parameterizedList.get(1);
}

public void methodB(List rawList) {
    rawList.add(1);
}

Код компилируется (с тем же предупреждением) и при выполнении выдает ClassCastException . Это происходит , когда метод get(int index) возвращает Целое число , которое не может быть присвоено переменной типа String :

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

6. Заключение

С необработанными типами трудно работать, и они могут привести к ошибкам в нашем коде.

Их использование может привести к катастрофическим последствиям, и, к сожалению, большинство из этих катастроф происходит во время выполнения.

Проверьте все фрагменты этого урока на GitHub .