РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
83 of 1163 menu

Сырой тип

Сырой тип (raw type) - это имя обобщенного класса или интерфейса, используемое без аргументов типа. Сырой тип нужен для совместимости со старым кодом, который был написан до появления дженериков. Когда мы используем сырой тип, вся информация о параметрах типа стирается, и компилятор начинает работать с типом так, будто он не является обобщенным.

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

Синтаксис

SomeGenericClass rawRef = new SomeGenericClass();

Пример

У нас есть обобщенный класс Box с параметром типа T. Создадим его сырой тип и положим внутрь число, а затем получим значение:

class Box<T> { private T value; public void set(T value) { this.value = value; } public T get() { return value; } } public class Main { public static void main(String[] args) { Box raw = new Box(); raw.set(123); Object res = raw.get(); System.out.println(res); } }

Результат выполнения кода:

123

Пример

Сырой тип не проверяется компилятором. Давайте положим в коробку строку, а достанем ее как число. Компилятор пропустит такой код, а ошибка возникнет только во время выполнения:

class Box<T> { private T value; public void set(T value) { this.value = value; } public T get() { return value; } } public class Main { public static void main(String[] args) { Box raw = new Box(); raw.set("abcde"); Integer res = (Integer) raw.get(); System.out.println(res); } }

Результат выполнения кода:

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

Пример

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

import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List raw = new ArrayList(); raw.add("abcde"); raw.add("12345"); Object res = raw.get(0); System.out.println(res); } }

Результат выполнения кода:

"abcde"

Смотрите также

  • параметр типа type-param,
    который задает тип внутри угловых скобок
  • стирание типов erasure,
    из-за которого сырой тип теряет информацию о типе
  • ромбовидный оператор diamond,
    который позволяет не дублировать параметры типа
  • обобщенный метод generic-method,
    который объявляет собственные параметры типа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить