Представлять тип Java как переменную - PullRequest
3 голосов
/ 20 сентября 2011

Можно ли сделать что-то подобное, используя функции Java?

class myClass {int i; String s;}

static void myMethod(myClass... args)
{
...
}

main()
{
   myMethod(2,"two",3,"three");
}

Ответы [ 4 ]

5 голосов
/ 20 сентября 2011

Это невозможно. Возможно, вы могли бы создать статический вспомогательный метод, который сделает создание ваших объектов максимально простым.

static myClass mc(int i, String s) {
    return new myClass(i, s);
}

myMethod(mc(2, "two"), mc(3, "three"));
4 голосов
/ 20 сентября 2011

Нет, но вы можете сделать конструктор из MyClass и вызвать:

myMethod(new MyClass(2, "two"), new Myclass(3, "three"));

Ради краткости вы можете создать статически импортированный фабричный метод:

public class MyClass {
    public MyClass create(String s, int i) {
        return new MyClass(s, i);
    }
}

и используйте:

myMethod(create(2, "two"), create(3, "three"));
1 голос
/ 20 сентября 2011

Да, sortof. Вам нужен конструктор вашего класса ...

public class MyClass{
   int i
   String s;

   public MyClass(int i, String s){
      this.i = i;
      this.s = s;
   }
}

public static void myMethod(MyClass... instances){
     .....
}

public static void myMethod(Object... args){

    MyClass[] instances = new MyClass[args.length / 2];
    for (int i=0; i<args.length / 2; i++){
         instances[i] = new MyClass((Integer)args[i * 2], (String)args[(i*2) + 1]);
    }

    myMethod(instances);
}

Вам нужно было бы добавить проверку ошибок, чтобы убедиться, что args имеет четное количество элементов, и нет способа обеспечить, чтобы каждый элемент i * 2 был целым числом, а каждый i * 2 + 1 - это строка. Но это возможно.

Учитывая все вышесказанное, я скажу ... это очень нестандартное программирование, и я бы не рекомендовал его. Но, как видите, это возможно.

1 голос
/ 20 сентября 2011

Вы можете сделать это с помощью класса-обёртки:

class MyWrapper {
    private int i;
    private String s;

    public MyWrapper(int _i, String _s) {
        i = _i;
        s = _s;
    }
}

class Test {
    static void myMethod(MyWrapper... args) {
        //do work
    }

    public static void main(String[] args) {
        myMethod(new MyWrapper(2, "two"), new MyWrapper(3, "three"));
    }
}
...