Может ли в Java анонимный класс объявлять свои параметры типа? - PullRequest
10 голосов
/ 23 января 2011

Может ли анонимный класс объявить свои параметры типа?

Ответы [ 3 ]

9 голосов
/ 23 января 2011

Вы правы, это невозможно.Поскольку анонимный класс предназначен для использования только один раз, какой смысл добавлять в него параметры типа, которые вы никогда не сможете использовать / наследовать?Вы не можете создать экземпляр анонимного класса более одного раза из любой другой позиции кода, кроме той, которая его определяет, и вы также не можете создать подкласс для него.

5 голосов
/ 23 января 2011

Нет. Спецификация языка Java исчерпывающе определяет возможные аргументы выражения создания экземпляра класса:

Выражение создания экземпляра класса определяет класс для создания экземпляра, возможно с последующими аргументами типа (если создается экземпляр класса общий (§8.1.2)), сопровождаемый (a возможно пустой) список актуальных значений аргументы в конструктор. это также возможно передать явный тип аргументы самого конструктора (если это универсальный конструктор (§8.8.4)). Аргументы типа для конструктор сразу же следовать ключевое слово new. Это время компиляции ошибка, если какой-либо из аргументов типа используется при создании экземпляра класса выражение является аргументом типа подстановочного знака (§4.5.1). Создание экземпляра класса выражения имеют две формы:

  • Создание экземпляра неквалифицированного класса выражения начинаются с ключевого слова новый. Неквалифицированный экземпляр класса выражение создания может быть использовано для создать экземпляр класса, независимо от того, является ли класс верхний уровень (§7.6), член (§8.5, §9.5), локальный (§14.3) или анонимный класс (§15.9.5).

  • Создание экземпляра квалифицированного класса выражения начинаются с первичного. создание экземпляра квалифицированного класса Выражение позволяет создавать экземпляры внутренних классов-членов и их анонимные подклассы.

Таким образом, хотя вы можете указывать фактические параметры типа суперкласса или интерфейса или конструктора, вы не можете определять новые. Хотя я допускаю, что это может быть полезно в некоторых редких случаях (поскольку новый параметр типа может использоваться из тела класса), для этого есть простой способ:

  • обернуть выражение создания экземпляра класса в универсальный метод (анонимный класс увидит параметр типа включающего метода)
  • использовать именованный класс
2 голосов
/ 23 января 2011

Но есть способ использовать параметры.

Любой объявленный метод внутри анонимного класса может использовать свойства

  • внешнего класса final
  • параметры метода и окончательный метод
  • переменные

следующий код демонстрирует это

public class Foo
{

    private String value = "Hello ";

    public void anonymousTest(final boolean asc)
    {
        final String world = "world";

        new Comparable<String>()
        {
           @Override
           public int compareTo(String o)
           {
                System.out.println( value + world);
                int cmp = value.compareTo(o);
                return asc ?cmp :0-cmp;
            }
        }; 
    }
}

Надеюсь, что пример поможет.

...