传递字符串时,Java 构造函数可变参数冲突

发布于 2024-12-12 20:32:13 字数 674 浏览 2 评论 0原文

我的一个班级有一个问题。我正在使用“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 个和更多参数。

我想处理这个 new Groupe("Foo,Bar");

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

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

我没有传递字符串,而是传递了 Varargs (选项卡?)...

I have an issue with one of my class. I'm using a "varargs" constructor for unknown number of parameter.

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());
    }
}

The first constructor is called...that's fine, but there is a conflict when passing only ONE parameter with the second contructor. I would like to use the second constructor when passing only one string, and the first if 2 and more parameters.

I'd want to handle this
new Groupe("Foo,Bar");

This is where I call it. I suspect the "error" comes from there

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

I don't pass a String, but a Varargs (tab?)...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

因为看清所以看轻 2024-12-19 20:32:14

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

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());
    }
}

Maybe this can be a solution:

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());
    }
}
过去的过去 2024-12-19 20:32:14

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.

The varargs part can be empty. So you can get what you want with

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());
}

You could also, of course, use one ctor with an if statement on the length of the input array, splitting out cases 0 (not handled with the code above), 1, and > 1.

雾里花 2024-12-19 20:32:14
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

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");
}
}

Output:

Constructor 1

Constructor 2

Constructor 1

风铃鹿 2024-12-19 20:32:13

应该没问题,但需要注意的是 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)

这样您在每种情况下的期望就会绝对清楚

It should be fine, with the caveat that null can be converted to either String[] or 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
    }
}

EDIT: Now that you've shown us the calling code, that's definitely the problem:

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

Here, the type of nom is String[] - so it will always call the first constructor. You've got an array of strings there - under what circumstances do you want to call the second constructor?

To be honest, given that the two constructors act significantly differently, I would actually make both constructors private, and provide static methods:

public static Groupe fromStringArray(String... nom)

public static Groupe fromCommaSeparatedString(String nom)

Then it will be absolutely clear what you're expecting in each case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文