方法,可选参数和/或接受多种数据类型

时间:2015-11-26 02:22:27

标签: java methods parameters

在浏览网页一段时间寻找我的问题的答案后,我找不到任何似乎能为我的问题提供有效解决方案的帖子。

目前,我会为每种不同的数据类型输入重载方法。

例如:

public void ex1(String in){
public void ex1(int in){

我认为有一种方法可以将其压缩成一行

public void ex1(opt(String in), opt(int in)){

public void ex1((String/int) in){

然而,就我所见,没有人提出合理的方法来使用这些形式。

重载确实有效,但看起来并不像我想的那样干净,所以任何变通办法或想法都会受到赞赏。

4 个答案:

答案 0 :(得分:1)

有一种方法,但您只能提供one可选参数。 这种方式是在参数类型前面使用...

例如:

public void ex1(int someint, String... in)){

在这种情况下,String in是一个可选参数,您可以提供或不提供。但int someint是必须提供的参数。

所以String... in基本上是String[] in。因为数组可以为null ....除此之外(至少我)不知道有任何其他方法来实现这一点。

这意味着您也无法执行某些操作,例如必须输入其中一个参数,而其他参数可以忽略。您可以忽略一个参数,而其他参数必须通过。

这也适用于每种方法只有一个参数。换句话说,只需一个参数可选。否则你必须使用方法重载。

但是(如评论中所述),这不是一种有效的方法。因为你必须为每个变量的可能性编写逻辑,并且与方法重载的甜蜜有效的方法相比,代码会非常混乱。

编辑:

varargs (或此可选参数)必须显示为方法中的最后一个参数。感谢@Makoto指出这一点。

答案 1 :(得分:0)

  

我认为有一种方法可以将其压缩成一行

你可能会这样做:

public void ex1(String in1, int in2) { // I don't believe they can have the same name
  // ...
}

就可选变量而言,我只需将变量设置为一个值,并在方法内部进行测试,以查看该值是否等于“默认”值。

ex1("Hey", 0);

public void ex1(String in1, int in2) {

  boolean useString = true;
  boolean useInt = true;

  if(in1.length() < 1) {
    useString = false;
  }
  if(in2 != 0) {
    useInt = false;
  }

  if(useString) {
    // ...
  }
  if(useInt) {
    // ...
  }

}

编辑:有关一个可选变量,请参阅Jaskaranbir Singh的回答。

答案 2 :(得分:-1)

尝试this

public void ex1(Serializable in){
// .....
}

始终适合我。 String是Serializable,对于原始类型,它使用autoboxing并自动将int转换为Integer,依此类推,而Integer也是Serializable,因此ex1(1)将作为exxx工作。您只需检测实际类型:

if(Integer.class.isInstance(in)){
int intVal = ((Integer)in).intValue();
// ...
} else if(String.class.isInstance(in)){
String strVal = (String) in;
// ...
}

转角情况是in为空时, - 在这种情况下很难检测到真实类型(仍然可能),但最重要的是你不需要它。

答案 3 :(得分:-2)

我会做的是:

public void ex1(String[] args){}

通过使用它,您可以拥有任意数量的数据类型(如果有)。

完整的代码看起来像这样:

public void ex1(String[] args){
   try{
      if(/*I know there is some parse string techique*/args[] == ...){
         //code here
      }
   catch(Exception E){}

希望你能得到这个想法,基本上你有一个字符串数组,将它解析为int,boolean,ect ......并将你在单独函数中放入的代码放入if语句