Что такое raw type java
Перейти к содержимому

Что такое raw type java

  • автор:

Raw Types

A raw type is the name of a generic class or interface without any type arguments. For example, given the generic Box class:

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

To create a parameterized type of Box , you supply an actual type argument for the formal type parameter T:

Box intBox = new Box<>();

If the actual type argument is omitted, you create a raw type of Box :

Box rawBox = new Box();

Therefore, Box is the raw type of the generic type Box . However, a non-generic class or interface type is not a raw type.

Raw types show up in legacy code because lots of API classes (such as the Collections classes) were not generic prior to JDK 5.0. When using raw types, you essentially get pre-generics behavior — a Box gives you Objects. For backward compatibility, assigning a parameterized type to its raw type is allowed:

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

But if you assign a raw type to a parameterized type, you get a warning:

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

You also get a warning if you use a raw type to invoke generic methods defined in the corresponding generic type:

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

The warning shows that raw types bypass generic type checks, deferring the catch of unsafe code to runtime. Therefore, you should avoid using raw types.

The Type Erasure section has more information on how the Java compiler uses raw types.

Unchecked Error Messages

As mentioned previously, when mixing legacy code with generic code, you may encounter warning messages similar to the following:

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

This can happen when using an older API that operates on raw types, as shown in the following example:

public class WarningDemo < public static void main(String[] args)< Boxbi; bi = createBox(); > static Box createBox() < return new Box(); >>

The term "unchecked" means that the compiler does not have enough type information to perform all type checks necessary to ensure type safety. The "unchecked" warning is disabled, by default, though the compiler gives a hint. To see all "unchecked" warnings, recompile with -Xlint:unchecked.

Recompiling the previous example with -Xlint:unchecked reveals the following additional information:

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

To completely disable unchecked warnings, use the -Xlint:-unchecked flag. The @SuppressWarnings("unchecked") annotation suppresses unchecked warnings. If you are unfamiliar with the @SuppressWarnings syntax, see Annotations.

Что такое raw type java

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

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

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

Box intBox = new Box<>();

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

Box rawBox = new Box();

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

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

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

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

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

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

Box 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)< Boxbi; bi = createBox(); > static Box createBox() < return new Box(); >>

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

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

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

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

Ваше использование этой страницы и всего материала на страницах под "Учебным баннером" Java подвергается этим официальным уведомлениям.

Авторское право © 1995, 2012 Oracle и/или его филиалы. Все права защищены.

Когда нужно использовать raw types?

Сначала вспомним, что такое raw type. В Java так называют generic-типы без указания типа-параметра. Такая языковая конструкция валидна, но в большинстве случаев приводит к предупреждению компилятора.

Предупреждение связано с риском получения проблемы heap pollution. Ей мы уже посвящали публикации ранее. Использование raw types никогда не оправдано – спецификация языка явно говорит: их поддержка остается только для обратной совместимости.

Есть всего три случая, когда использовать обобщенный тип без параметра правильно:
• Целевая версия Java < 5.0 (2002 год и ранее – вряд ли это ваш случай);
• В литерале класса. List.class не сработает, нужно писать List.class ;
• В операторе instanceof . Вместо instanceof Set должно быть instanceof Set .

Java Raw Types in Generics

In the world of Java programming, one concept that often sparks confusion and debate is the use of raw types in generics. Generics were introduced in Java 5 to provide type safety and enable developers to write more reusable and robust code. However, raw types can still be encountered in legacy codebases or in certain situations where generics may not be applicable or practical. In this article, I will try to explain raw types, exploring their characteristics, limitations. So, let’s dive in and unravel the mysteries of Java raw types in generics.

If you don’t have a medium membership, you can use this link to reach the article without a paywall.

Make Your Mac Terminal Productive and Beautiful with Zsh and Fig

If you don’t have a medium membership, you can use this link to reach the article without a paywall.

Before we start looking at raw types, it’s essential to have a clear understanding of generics in Java. Generics allow us to define classes, interfaces, and methods that can work with different types, ensuring type safety at compile time. By using generics, we can specify the expected type(s) when defining and using classes, enabling the compiler to enforce type correctness and provide better error detection.

Generics bring several advantages to Java programming. They promote code reusability by enabling the creation of generic classes and methods that can work with multiple types. They enhance code readability by providing type information at the declaration site, reducing the need for explicit type casting. Additionally, generics offer compile-time type checking, helping to catch type-related errors early in the development process.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *