Понимание безопасности типов в обобщениях
Обобщения обеспечивают безопасность типов, гарантируя, что мы определяем только один тип объектов для работы одновременно. В следующем блоке кода мы создадим ArrayList
целых чисел без определения его параметра типа. Использовать обобщения без параметров типа - это плохая практика. Код скомпилируется, но при попытке обратиться к элементам другого типа будет возвращена ошибка времени выполнения.
// ~/project/Main.java
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList integerList = new ArrayList();
integerList.add(1);
integerList.add(2);
integerList.add(3);
integerList.add("Hello World");
for (Object element : integerList) {
System.out.println((Integer)element);
}
}
}
Для запуска кода откройте терминал и перейдите в каталог ~/project
. Скомпилируйте код с помощью следующей команды:
javac Main.java
После успешной компиляции запустите код с помощью следующей команды:
java Main
Результат выполнения кода будет:
1
2
3
Exception in thread "main" java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.lang.Integer
at Main.main(Main.java:13)
Мы получаем ошибку времени выполнения, потому что integerList
содержит элементы типа Integer
и String
. Это происходит потому, что мы не определили параметр типа при создании integerList
.