2015-04-29 4 views
3

Мне нужно вызвать следующий метод.Передача встроенного построенного класса в качестве аргумента класса методу

void foo(Class<? extends Bar> cls); 

Для cls аргумента, мне нужно передать класс, который только подменяет один метод Bar.

Я хочу знать, есть ли способ написать определение моего нового класса inline в вышеупомянутом вызове без написания нового класса в отдельном файле, который расширяет Bar.

ответ

5

три варианта:

  • Вы можете создать вложенный класс в пределах того же класса, который вы хотите использовать этот код; нет необходимости в новом файле

    public static void doSomething() { 
        foo(Baz.class); 
    } 
    
    private static class Baz extends Bar { 
        // Override a method 
    } 
    
  • Вы не могли бы объявить именованный класс в рамках метода:

    public static void doSomething() { 
        class Baz extends Bar { 
         // Override a method 
        } 
        foo(Baz.class); 
    } 
    

    Объявление класса в методе, как это очень необычно, заметьте.

  • Вы можете использовать анонимный внутренний класс, но затем вызвать getClass():

    public static void doSomething() { 
        foo(new Bar() { 
         // Override a method 
        }.getClass()); 
    } 
    

Последний вариант создает экземпляр анонимного внутреннего класса только получить Class объект, конечно, что не является идеальным.

Лично я бы возможно перейти к первому варианту.

+0

В вышеприведенных трех вариантах только первый параметр разрешил 'foo' создавать новый экземпляр' cls.newInstance() ' –

+0

@LahiruChandima: Даже когда' doSomething' был статическим методом? Интересно и удивительно - я подозреваю, что компилятор добавлял параметр конструктора для захваченных переменных, даже когда никто не был захвачен. –

+0

Я не проверял статическую 'doSomething()'. В моем случае мне нужно вызвать 'foo' в нестационарном контексте. –

2

Да, вы можете просто объявить анонимный класс и использовать getClass() метод на него:

foo(new Bar() { 
    //implement your method here 
}.getClass()); 
Смежные вопросы