Какие из этих выражений компилируются?
HashSet<Number> hs = new HashSet‹Integer>();
HashSet<? super ClassCastException› set = new HashSet<Exception>();
List<object> values - new HashSet<object›();
List‹? extends Object> objects = new ArrayList<object>();
Другие предметы Университет Обобщения (Generics) программирование на Java компиляция выражений HashSet List классы Java generics в Java ошибки компиляции Java университетское программирование изучение Java основы Java Новый
Чтобы определить, какие из приведенных выражений компилируются, давайте рассмотрим каждое из них по отдельности.
В этом выражении мы создаем переменную hs
типа HashSet<Number>
и пытаемся инициализировать ее экземпляром HashSet<Integer>
. Это не скомпилируется, потому что HashSet<Integer>
не является подтипом HashSet<Number>
. В Java обобщения (generics) не поддерживают ковариантность, поэтому это выражение не компилируется.
В этом выражении мы создаем переменную set
типа HashSet<? super ClassCastException>
и инициализируем ее экземпляром HashSet<Exception>
. Это выражение также не скомпилируется, поскольку Exception
не является суперклассом ClassCastException
, и, следовательно, не соответствует ограничению, указанному в обобщении.
Здесь мы пытаемся создать переменную values
типа List<object>
и инициализировать ее экземпляром HashSet<object>
. Однако в Java тип object
должен быть с заглавной буквы, т.е. Object
. Из-за этого выражение не компилируется.
В этом выражении мы создаем переменную objects
типа List<? extends Object>
и инициализируем ее экземпляром ArrayList<object>
. Как и в предыдущем случае, object
должно быть с заглавной буквы, т.е. Object
. Поэтому это выражение также не компилируется.
Таким образом, все четыре выражения не компилируются. Основные причины - это неправильное использование типов и обобщений, а также неверное написание типов (например, object
вместо Object
).