Почему this.getClass дает собственное имя класса, а не имя класса Anonymous? - PullRequest
4 голосов
/ 26 мая 2019

Я создал анонимный класс, реализовав интерфейс I внутри открытого статического метода void main (). Так, согласно Java 8 для абстрактного метода test (), реализация обеспечивается из метода Implement () класса C.

Итак, внутри публичного статического метода void main (), печатая _interface.getClass (), я получил

package_path.Main $$ Lambda $ 1/310656974, что совершенно нормально. Поскольку это печатает анонимное имя класса.

Кроме того, _interface указывает на анонимный объект в куче, и поэтому я делаю _interface.test ();

Итак, первое утверждение, которое теперь имеет метод test (), - это напечатать имя класса,

Но, в конце концов, то, что было напечатано, package_path.C (сообщая, что C - это имя класса). Как это возможно? Разве не следует печатать package_path.Main $$ Lambda $ 1/310656974? Потому что «это» означает анонимный внутри метода теста, верно?

@java.lang.FunctionalInterface
interface I {
    void test();
}

class C {
    void imple() {
        System.out.println(this.getClass());
        System.out.println("Inside Implementation");
    }
}

class Main {
    public static void main(String[] args) {
        I _interface = new C()::imple;
        System.out.println(_interface.getClass());
        _interface.test();
    }
}

1 Ответ

4 голосов
/ 26 мая 2019

Надеюсь, это поможет вам понять, что когда вы объявляете

I _interface = new C()::imple;

, вы фактически реализуете интерфейс, похожий на (, но не такой, как ):

I _interface = new I() {
    @Override
    public void test() {
        new C().imple(); // creating an instance of class `C` and calling its 'imple' method
    }
};

Следовательно, когда вызывается метод test, он сначала создает экземпляр C, который печатает

class x.y.z.C 

как класс.

Потому что«this» означает «анонимный» внутри тестового метода, верно?

Теперь, как вы можете видеть выше, больше нет анонимного класса, из которого вызывается imple, следовательно, thisбольше не представляет анонимный класс.

Как пояснил Хольгер в комментариях, несмотря на то, что на вызывающем сайте он представлен как лямбда или анонимный класс, this.getClass() внутри метода класса C будет оцениваться в C.class независимо от того,как выглядит вызывающая сторона.

Рекомендовать : продолжить чтение и следовать Есть ли какое-либо преимущество во время использования лямбда-выражения в Java?

...