Анонимный внутренний класс

class One {
Two two() {
    return new Two() {
        Two(){}
        Two(String s) {
            System.out.println("s= "+s);
        }
    };
    }
}

class Ajay {
    public static void main(String ...strings ){
        One one=new One();
        System.out.println(one.two());
    }
}

Приведенный выше пример кода не может быть скомпилирован. Он говорит: «Невозможно разрешить два». В чем проблема в этом коде??


person tin_tin    schedule 01.03.2011    source источник
comment
Есть проблемы с кодом??   -  person tin_tin    schedule 01.03.2011


Ответы (3)


new Two() {
    Two(){}
    Two(String s) {
        System.out.println("s= "+s);
    }
};

Анонимный внутренний класс называется анонимным, потому что он не имеет собственного имени и на него нужно ссылаться по имени базового класса или интерфейса, который он расширяет/реализует.

В вашем примере вы создаете анонимный подкласс Two, поэтому Two должен быть где-то объявлен либо как класс, либо как интерфейс. Если класс Two уже объявлен, у вас либо нет его в пути к классам, либо вы забыли его импортировать.

person josefx    schedule 01.03.2011
comment
Спасибо. Я забыл объявить класс Two. Infact, я не знал, что класс Two должен быть объявлен, потому что в книге, на которую я ссылаюсь, это не упоминается. - person tin_tin; 01.03.2011

вы создаете

new Two() поэтому в пути к классам должен быть допустимый класс.

сделай это

class Two{

}

class One {
Two two() {
    return new Two() {
//        Two(){}
//        Two(String s) {
//            System.out.println("s= "+s);
//        }//you can't override constuctors
    };
    }
}

или слева от нового должен быть суперкласс или интерфейс, чтобы он работал

person jmj    schedule 01.03.2011
comment
@jigar ... нет, он использует динамическую генерацию классов следующего поколения, которая автоматически создает любой класс, которого нет в пути к классам, а также создает для него разумные методы;) - person Suraj Chandran; 01.03.2011
comment
Поскольку Two на самом деле реализуется как анонимный внутренний класс, может иметь смысл объявить его как интерфейс или абстрактный класс, а не как класс. - person MAK; 01.03.2011
comment
@MAK реализуется как анонимный внутренний класс только для показанного кода - person jmj; 01.03.2011

Вы не объявили класс Two. Вы объявили класс One и закрытый член two, где two — это объект класса Two, который вы пытались инициализировать анонимной конструкцией.

person Nikolay Antipov    schedule 01.03.2011
comment
two не объявлен закрытым - person Alpine; 01.03.2011
comment
Two(){} — конструктор, а Two two(){} — метод класса One. - person Alpine; 01.03.2011