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

传递字符串时Java构造函数varargs冲突,java,constructor,conflict,variadic-functions,Java,Constructor,Conflict,Variadic Functions,我和我班上的一个同学有问题。我正在为未知数量的参数使用“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)

我和我班上的一个同学有问题。我正在为未知数量的参数使用“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());
    }
}
第一个构造函数被调用……这很好,但是当只传递一个参数与第二个构造函数时会发生冲突。我想在只传递一个字符串时使用第二个构造函数,如果传递两个或更多参数,则使用第一个构造函数

我想处理这件事 新集团(“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());
    }
}
输出:

构造器1

建造师2


构造函数1

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,将案例0(不使用上面的代码处理)、1和>1分开。

我想处理这个:新测试(“Foo,Bar”)@用户1023021:那么问题出在哪里?这将调用第二个构造函数,然后用逗号拆分字符串。第二个构造函数永远不会被调用,因为“Foo,Bar”也是一个字符串。所以varags构造函数被称为wich,我不想这样做。@user1023021:不,它不是。运行我的示例代码!我怀疑你用的诊断方法都误导了自己。不幸的是,您没有提供足够的代码让我们看到…您是对的。但是为什么我的单个构造函数没有被调用呢?我试着把它放在倍数上面。我将编辑OP并在调用itI的地方添加代码。我已经尝试过了…使用单参数调用varargs构造函数,而不是单参数构造函数。在Java中对构造函数进行排序是不相关的。目前,我正在使用类似的解决方案。谢谢图里奥
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());
}