Java-конструктор конфликтует при передаче строки - PullRequest
2 голосов
/ 01 ноября 2011

У меня проблема с одним из моих учеников.Я использую конструктор "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());
    }
}

Первый конструктор называется ... это нормально, но возникает конфликт при передаче только ОДНОГО параметра со вторым конструктором.Я хотел бы использовать второй конструктор при передаче только одной строки и первый, если 2 и более параметров.

Я бы хотел обработать эту новую группу ("Foo, Bar");

Вот где я это называю.Я подозреваю, что "ошибка" происходит оттуда

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

Я передаю не строку, а переменную (вкладка?) ...

Ответы [ 4 ]

9 голосов
/ 01 ноября 2011

Ничего страшного, с оговоркой, что 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)

Тогда будет абсолютно ясно , что вы ожидаете в каждом случае.

2 голосов
/ 01 ноября 2011

Может быть, это может быть решением:

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 голос
/ 01 ноября 2011

Часть 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());
}

Вы также можете, конечно, использовать один ctor с оператором if для длины входного массива, разбивая случаи на 0 (не обрабатывается с помощью кода выше).), 1 и> 1.

0 голосов
/ 01 ноября 2011
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

...