В методе append1 описано создание экземпляра класса E через якобы констуктор E(). Это было бы весьма полезно, но логика языка Java позволяет создавать экземпляры параметризованого типа только так, как описано в методе append2.
P.S. throws Exception и конструкция try {} catch() {} используется из-за того, что метод newInstance() может выбрасить ошибку. Детальнее об ошибках будет описано далее в курсе.
3. Недопустимо, чтобы параметризованый тип класса-дженерика использовался в объявлении статических полей или методов.
Рассмотрим статическое поле параметризированого типа в классе.Оно должно быть одинаково для всех екземпляров класса. Но екземпляры могут быть с разными типами (например, <Integer> или <String>). Но тогда и статическое поле должно быть своего типа для каждого екземпляра, что протеворечит цели статического поля. Аналогичные рассуждения для статического метода. И вот пример:
Удалив статическое поле и статический метод, можно добиться компиляции кода, не раньше.
4. Нельзя использвоть instanceof с параметризованым типом и конкретным типом.
|
|
Для начала поймём, что такое instanceof. Это оператор, который проверяет на принадлежность объекта классу. Также если класс переменной наследует проверяемый класс, то возвращает true Если слева не объект абстрактного класса и объект не принадлежит проверяемому классу вылетает ошибка.
Теперь попытаемся проверить параметризованый тип на принадлежность разным класса:
Рассмотри первый метод. По комментарию уже видно, что он неправильный J Дело в том, что list может быть любого типа из (List<Integer>, List<Character>, List<String>…),и клмпилятор не может указать принадлежность.
Второй метод. Вот здесь другое дело: любой из возможных вариантов (List<Integer>, List<Character>, List<String>…) является подклассом List<?>. Также ArrayList<?> - является непараметризируемым, тот есть не подходит под условия запрета, что делает его возможным для применения.
Самое интересное: третий и четвёртый методы. А интересны они тем, что я не указал выбасывают они ошибку или нет. Поэтому: «Думайте сами, решайте сами...». Я серьёзно: попытайтесь отгадать.
5. Невозможно создавать массивы из дженериков.
Итак всё понятно.
6. Нельзя создавать, ловить и бросать объекты параметризированого типа.
А здесь, как раз непонятно, потому что тему исключительных ситуаций ещё не прошли. Не беспокойтесь: если не умеете создавать, ловить и бросать ошибки, то вы этого и не сделаете:).
7. Нельзя перегружать методы, где аргументы отличаются только параметризованым типом.
Это очень просто:
ТАК ДЕЛАТЬ НЕЛЬЗЯ!
Компилятор обижается ^). Тут нужно менять имя второй функции.