Сырой тип
Сырой тип (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,
который объявляет собственные параметры типа