Является ли интерфейс php избыточным для приложений, созданных одним разработчиком?

Мой вопрос: в PHP действительно полезны интерфейсы для разработчиков, которые сами создают веб-приложения? Разве абстрактный класс не предоставляет все то, что обеспечивает интерфейс?

Если интерфейс - это просто «контракт», разве разработчик не знает, что должен реализовать класс?

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

Как вы можете понять, я все еще жду того момента A-HA, когда я действительно пойму, почему интерфейс полезен.

Чтобы закончить это и выразить это просто: f (* args) # это вызывает f (1,2,3,4) Возможно ли это в Java? чтобы уточнить - у f есть список аргументов переменной длины.

В python я могу сделать:

args = [1,2,3,4]
f(*args) # this calls f(1,2,3,4)

Возможно ли это в java?

чтобы уточнить - у f есть список аргументов переменной длины.

9
задан mik01aj 26 August 2010 в 08:37
поделиться

3 ответа

Конечно, вы сможете сделать именно это, используя vararg-методы. Если вы беспокоитесь о двусмысленности, когда речь идет о таких аргументах, как Объект... , этот фрагмент кода должен прояснить:

public class Test {

    public static void varargMethod(Object... args) {
        System.out.println("Arguments:");
        for (Object s : args) System.out.println(s);
    }

    public static void main(String[] args) throws Exception {
        varargMethod("Hello", "World", "!");

        String[] someArgs = { "Lorem", "ipsum", "dolor", "sit" };

        // Eclipse warns:
        //   The argument of type String[] should explicitly be cast to Object[]
        //   for the invocation of the varargs method varargMethod(Object...)
        //   from type Test. It could alternatively be cast to Object for a
        //   varargs invocation
        varargMethod(someArgs);

        // Calls the vararg method with multiple arguments
        // (the objects in the array).
        varargMethod((Object[]) someArgs);

        // Calls the vararg method with a single argument (the object array)
        varargMethod((Object) someArgs);
    }
}

Вывод:

Arguments:
    Hello
    World
    !
Arguments:
    Lorem
    ipsum
    dolor
    sit
Arguments:
    Lorem
    ipsum
    dolor
    sit
Arguments:
    [Ljava.lang.String;@1d9f953d

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

nonVarargMethod(args[0], args[1], args[2]);

.Более того, компилятор не может разрешить ситуацию для перегруженных методов на основе размер или тип массива.

4
ответ дан 4 December 2019 в 21:47
поделиться

Метод можно объявить с параметром varargs и вызвать с помощью массива, как это предлагается в других ответах.

Если метод, который вы хотите вызвать, не имеет параметра varargs, вы можете сделать что-то подобное с самоанализом, хотя это немного неуклюже:

class MyClass {
  public void myMethod(int arg1, String arg2, Object arg3) {
    // ...code goes here...
  }
}

Class<MyClass> clazz = MyClass.class;
Method method = clazz.getMethod("myMethod", Integer.TYPE, String.class, Object.class);

MyClass instance = new MyClass();
Object[] args = { Integer.valueOf(42), "Hello World", new AnyObjectYouLike() };
method.invoke(instance, args);
4
ответ дан 4 December 2019 в 21:47
поделиться

Есть два способа использовать varargs в java

public static void main(String... args)

Или

public static void main(String[] args)

В моем примере это со строкой, но вы можете сделать это и с целым числом.

Чтобы вызвать их (это работает на обоих),

main("hello", "world");

или

main(new String[]{"hello", "world"});
1
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: