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

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

4 ответов


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


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

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

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

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

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

  • оберните выражение создания экземпляра класса в общий метод (анонимный класс увидит параметр типа заключительного метода)
  • использовать в имени класс!--9-->

нет.


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

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

  • свойства внешнего класса 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;
            }
        }; 
    }
}

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