func_get_args PHP,varargs的Java转换

时间:2013-06-27 23:30:38

标签: java php variadic-functions

亲切的问候......

我在PHP中使用它。

function Func0($sString1,$iInteger0,$sString2) {
  $OrigArgs = func_get_args();//The arguments
  Func1($OrigArgs,1);
}
function Func1($OriginalArgs,$AddedArg) {
  $NumFirstArgs = size($OriginalArgs);
  if ($NumFirstArgs>3) {
    print("you have more than 3 arguments originally");
  }
}

我需要将上面的代码翻译成Java

我需要在java中捕获原始参数/参数并在其他函数中使用它们......

正如您所看到的,根据Java,参数可以使用不同的类型。

public void Func0(String sString1,int iInteger0,String sString2) {
  Object[] OrigArgs = func_get_args();//The arguments
  Func1(OrigArgs,1);
}
public void Func1(Object[] OriginalArgs,int AddedArg) {
  int NumFirstArgs = OriginalArgs.length;
  if (NumFirstArgs>3) {
    System.out.println("you have more than 3 arguments originally");
  }
}

谢谢,

2 个答案:

答案 0 :(得分:1)

public Object[] func_get_args(Object... argv) {
  int TheSize = 0;
  for (int i = 0; i<argv.length; i++) {
    if(argv[i]!= null && argv[i].getClass().isArray()) {
      Object[] OneArray = (Object [])argv[i];
      TheSize += OneArray.length;
    } else {
      TheSize += 1;
    }
  }
  Object[] NewArray = new Object[TheSize];
  int ThePos = 0;
  for (int i = 0; i<argv.length; i++) {
    if(argv[i]!= null && argv[i].getClass().isArray()) {
      Object[] OneArray = (Object [])argv[i];
      System.arraycopy(OneArray, 0, NewArray, ThePos, OneArray.length);
      ThePos += OneArray.length;
    } else {
      Object[] OneArray = {argv[i]};
      System.arraycopy(OneArray, 0, NewArray, ThePos, 1);
      ThePos += 1;
    }
  }
  return NewArray;
}

使用新方法:

  String Name = "AStringExample";
  String Style = "TheStyle";
  Object[] argv = {7,9};
  Object[] argc = {Name,Style};
  Object[] NewArray = func_get_args(argv,Name,Style,argc);
  for (int i = 0; i < NewArray.length;i++) {
    System.out.println("i="+i+" -> "+NewArray[i].toString());
  }

输出:

i=0 -> 7
i=1 -> 9
i=2 -> AStringExample
i=3 -> TheStyle
i=4 -> AStringExample
i=5 -> TheStyle

像问题一样使用:

public void Func0(String sString1,int iInteger0,String sString2) {
  Object[] OrigArgs = func_get_args(sString1,iInteger0,sString2);//The arguments
  Func1(OrigArgs,1);
}
public void Func1(Object[] OriginalArgs,int AddedArg) {
  int NumFirstArgs = OriginalArgs.length;
  if (NumFirstArgs>3) {
    System.out.println("you have more than 3 arguments originally");
  }
}

答案 1 :(得分:0)

如果你有一个像Object... foo这样的最后一个参数,那么foo将是所有varargs的数组,即除了非变量参数之外的所有“其余”参数。换句话说,您可以将您的函数声明为

public void Func0(String sString1, int iInteger0, String sString2, Object... more)

more只会在第3个之后包含参数

要与原始代码最匹配,您可以(sString1iInteger0sString2不再是参数,如果需要,您必须手动提取它们) :

public void Func0(Object... OrigArgs) {
  Func1(OrigArgs,1);
}
public void Func1(Object[] OriginalArgs,int AddedArg) {
  int NumFirstArgs = OriginalArgs.length;
  if (NumFirstArgs>3) {
    System.out.println("you have more than 3 arguments originally");
  }
}