Как структурировать универсальный класс Java для приема аргументов неуниверсального конструктора - PullRequest
1 голос
/ 29 марта 2019

Я пишу простой универсальный класс утилит, который предоставляет конструктор, который принимает аргумент T [].Я хотел бы установить второй конструктор, который принимает аргумент String, но использует первый конструктор как часть установки.

public class PermGenerator<T> {
    private final T[] values;
    public PermGenerator(T[] vals) {
        values = Arrays.copyOf(vals, vals.length);
    }
    public PermGenerator(String str) {
        this(str.chars().mapToObj(c -> (char)c).toArray(Character[]::new));
    }

Я бы ожидал, что второй конструктор отобразит String в массив символови затем вызовите первый конструктор.

Вместо этого компилятор Java жалуется, что не может быть найден подходящий конструктор.

Можно ли это реструктурировать, чтобы выполнить то, что я имею в виду?Спасибо.

Вот один подход, который может быть приемлемым.Предоставьте статический вспомогательный метод для преобразования строки в массив символов.Не так гладко, как C ++, но он будет работать:

    public static final Character[] asArray(String str) {
        return str.chars().mapToObj(c -> (char)c).toArray(Character[]::new);
    }

Таким образом, для создания класса пользователю потребуется использовать следующий синтаксис:

    PermGenerator gen = new PermGenerator(PermGenerator.asArray("ACBC"));

1 Ответ

0 голосов
/ 30 марта 2019

Как насчет предоставления статического вспомогательного метода, который напрямую создает экземпляр соответствующего типа?

public static final PermGenerator<Character> Create(String str) {
    return new PermGenerator(str.chars().mapToObj(c -> (char)c).toArray(Character[]::new));
}

Ваши пользователи могут просто позвонить:

PermGenerator gen = PermGenerator.Create("ABC");

(В зависимости от ваших предпочтений и правил разработки API, которые вы используете в своей библиотеке, вы, конечно, можете использовать более конкретное имя, чем Create, например CreateFromString.)

...