Пример утиной печати в Java

Я читал примеры представлений Duck Typing в Java с отражением. Я хотел бы знать, правильно ли это:

public interface Quackable {
    public void quack();
}

В основном...

Object[] vec = {(Here I add some instances)};

for(int i=0; i < vec.length; i++) {
    if(vec[i] instanceof Quackable)
        vec[i].quack();
}

person gibarsin    schedule 26.11.2014    source источник
comment
Здесь есть вопрос?   -  person Maroun    schedule 26.11.2014
comment
В каком порядке правильно? Ваш код правильный, но здесь нет утиного ввода.   -  person Maroun    schedule 26.11.2014
comment
Почему бы просто не создать массив типа Quackable[] (или список типа Quackable).   -  person Invisible Arrow    schedule 26.11.2014
comment
Ну, идея состоит в том, чтобы узнать во время выполнения, реализует ли экземпляр Quackable Interface. Если это так, то он может крякать. Разве это не утка печатает?   -  person gibarsin    schedule 26.11.2014


Ответы (1)


В Java нет утиной печати, как в Python. Вы можете использовать отражение, чтобы узнать, есть ли в классе метод, который вы хотите вызвать, но это действительно проблема.

Похоже на то

Class<?> aClass = object.getClass();
try {
    Method method = aClass.getMethod("methodName", argType1, argType2);
    method.invoke(arg1, arg2)
} catch (NoSuchMethodException | SecurityException e) {
    e.printStackTrace();
}

Это также возможно не в каждой среде. Если диспетчер безопасности включен, ваш код должен иметь достаточные права для выполнения приведенного выше кода. Это также добавляет существенной работы.

person Grzegorz Żur    schedule 26.11.2014