Правила для параметризованных типов




1. Параметризация не применяется для примитивных типов.

2. Исследование типов времени выполнения (методы instanceof, getClass и т.д.) работает только с «сырыми» типами (т.е. они не видят не учитывают параметризованный тип.

Например:

if (a instanceof Pair<String>) //то же самое, что и instanceof Pair
if (a instanceof Pair<T>) // T игнорируется
Pair<String> p = (Pair<String>)a; //предупреждение – проверяет только, что а является Pair
new Pair<String>().getClass(); //вернет Pair.class, т.е. информация о параметризованном типе теряется

 

3. Нельзя генерировать и перехватывать исключения-экземпляры обобщенного класса (можно только указывать их в спецификациях исключений)

4. Массивы параметризованных типов не разрешены

5. Нельзя создавать экземпляры переменных типов (в качестве обходного пути можно использовать метод Class.newInstance(), но детали реализации достаточно сложны).

6. Параметризованные типы нельзя использовать для статических полей и методов обобщенных классов.

7. Класс или переменная типа не могут одновременно быть подтипами двух интерфейсов, которые представляют собой разные параметризации одного и того же интерфейса. Например, следующий код неверен:

class Calendar implements Comparable<Calendar> {... }

class GregorianCalendar extends Calendar

implements Camparable<GregorianCalendar> {... } // ОШИБКА

 

 

Вложенные классы

В литературе по Java встречаются такие термины, как "внутренние классы" (inner classes) и "вложенные классы" (nested classes). Говорить мы будем о вложенных классах, для которых inner классы являются подмножеством.

Вложенный класс - это класс, который объявлен внутри объявления другого класса

Пример:

class OuterClass {

static class StaticNestedClass {

}

}

Вложенные классы делятся на статические (в примере выше StaticNestedClass - это именно он) и нестатические (non-static).

 
 


Статические вложенные классы

Доступ

  1. Не имеют доступа к нестатическим полям и методам обрамляющего класса
  2. Имеют доступ к любым статическим методам внешнего класса, в том числе и к приватным

Обращение

Снаружи обращение к статическому вложенному классу осуществляется через имя обрамляющего класса.

Для примера выше это выглядит так:

OuterClass.StaticNestedClass instance =

new OuterClass.StaticNestedClass();

 

Использование

Используются для:

  1. Логической группировки сущностей.
  2. Улучшения инкапсуляции.
  3. Экономии class-space.
  4. Тестирования приватных статических методов обрамляющего класса.

Пример:

public class ClassToTest {

private static void internalMethod() {... }

 

public static class Test {

public void testMethod() {... }

}

}

Дело в том, что после компиляции данного кода мы получим 2 файла - ClassToTest.class и ClassToTest$Test.class. При чем класс ClassToTest никакой информации о вложенном классе иметь не будет (если не вызывать методы вложенного класса, а это для тестов нам и не надо), а потому скомпилированный ClassToTest$Test.class потом можно просто удалить билд скриптом.

 

 

Внутренние классы

Внутренние классы в Java делятся на такие три вида:

· внутренние классы-члены (member inner classes);

· локальные классы (local classes);

· анонимные классы (anonymous classes).

Внутренние классы-члены

Внутренние классы-члены ассоциируются не с самим внешним классом, а с его экземпляром.

Доступ

Имеют доступ ко всем полям и методам экземпляра обрамляющего класса.

Обращение

Например, дан такой класс

public class Users {

public class Query {

public Query() {... }

public void setLogin(String login) {... }

public void setCreationDate(Date date) {... }

public List<User> list() {... }

public User single() {... }

}

}

Создать его экземпляр можно через создание экземпляра обрамляющего класса

Users users = new Users();

Users.Query query = users.new Query();

Ограничения

1. Inner class не может иметь статических объявлений (вместо этого можно объявить статические методы у обрамляющего класса). Исключением являются константы (static final).

2. Внутри таких классов нельзя объявлять перечисления.

3. Нельзя объявить нестатический внутренний интерфейс, так как элементарно не будет объекта для ассоциации с экземпляром внешнего класса (любой объявленный внутренний интерфейс будет интерпретироваться как статический, то есть неявно будет добавлен модификатор static).

 

Локальные классы

Декларируются внутри методов либо в статических или нестатических блоках инициализации. Как и внутренние классы-члены, ассоциируются с экземплярами классов.

Доступ

  1. Имеют доступ ко всем полям и методам обрамляющего класса.
  2. Имеют доступ к тем локальным переменным и параметрам объемлющего метода, которые объявлены с модификатором final.

Ограничения

1. они видны только в пределах блока, в котором объявлены;

2. они не могут быть объявлены как private, public, protected или static;

3. они не могут иметь внутри себя статических объявлений (полей, методов, классов); исключением являются константы (static final)

  1. нельзя создать локальные интерфейсы.


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: