繁体   English   中英

传递字符串时,Java构造函数varargs发生冲突

[英]Java constructor varargs conflict when passing string

我和我的一个班级有问题。 我正在使用“varargs”构造函数来获取未知数量的参数。

public Groupe(String...nom){        
    for(String item:nom){   
        this.nom.add(item.toLowerCase());
    }
}

public Groupe(String nom){      
    String[] list =nom.split(",");
    for(String s : list){           
        this.nom.add(s.toLowerCase());
    }
}

第一个构造函数被调用......这很好,但是当第二个构造函数只传递一个参数时会发生冲突。 我想在传递一个字符串时使用第二个构造函数,并且第一个if 2和更多参数。

我想要处理这个新的Groupe(“Foo,Bar”);

这就是我所说的。 我怀疑“错误”来自那里

public void reserver(String...nom){
    Groupe gr = new Groupe(nom);
    passager.add(gr);       
}

我不传递字符串,而是传递Varargs(tab?)...

它应该没问题,但需要注意的是null可以转换为String[]String

public class Test {

    public Test(String single) {
        System.out.println("Single");
    }

    public Test(String... multiple) {
        System.out.println("Multiple");
    }

    public static void main(String[] args) {
        new Test("Foo"); // Single
        new Test("Foo", "Bar"); // Multiple
        new Test(); // Effectively multiple
        // new Test(null); // Doesn't compile - ambiguous
        new Test((String) null); // Single
    }
}

编辑:既然你已经向我们展示了调用代码,那肯定是问题所在:

public void reserver(String...nom){
    Groupe gr = new Groupe(nom);
    passager.add(gr);       
}

这里, nom的类型是String[] - 所以它总是调用第一个构造函数。 你有一个字符串数组 - 在什么情况下你想调用第二个构造函数?

老实说,鉴于两个构造函数的行为有很大不同,我实际上会将两个构造函数都设置为私有,并提供静态方法:

public static Groupe fromStringArray(String... nom)

public static Groupe fromCommaSeparatedString(String nom)

那么在每种情况下你都会非常清楚你期待的是什么。

也许这可以是一个解决方案:

public Groupe(String...nom){       
    if (nom.length == 1) {
        add(nom[0].split(","));
    } else {
        add(nom);
    }
}

private void add(String[] list) {
    for(String s : list){           
        this.nom.add(s.toLowerCase());
    }
}

varargs部分可以是空的。 所以你可以得到你想要的东西

public Groupe(String nom){
  String[] list = nom.split(",");
for(String s : list){           
    this.nom.add(s.toLowerCase());
}

 public Groupe(String nom1, String nom2, String...nom){   
this.nom.add(nom1);
this.nom.add(nom2);     
for(String item:nom)    
    this.nom.add(item.toLowerCase());
}

当然,您也可以在输入数组的长度上使用一个带有if语句的ctor,将case 0分开(不用上面的代码处理),1和> 1。

public class OverloadVarArgs {

public static void main(String... args){
    OverloadVarArgs a = new OverloadVarArgs("One Argument");
    OverloadVarArgs b = new OverloadVarArgs("Two", "Arguments");
    OverloadVarArgs c = new OverloadVarArgs("One, Argument");

}

public OverloadVarArgs(String a){
    System.out.println("Constructor 1");
}

public OverloadVarArgs(String... a){
    System.out.println("Constructor 2");
}
}

输出:

构造函数1

构造函数2

构造函数1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM