如何构造Java通用类以接受非通用构造函数参数

时间:2019-03-28 22:57:12

标签: generics types constructor inference

我正在编写一个简单的实用程序泛型类,该类提供带有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编译器抱怨找不到合适的构造函数。

这可以重组以实现我的想法吗? 谢谢。

这是一种可以接受的方法。提供静态助手方法,将String转换为Character数组。不会像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 :(得分:0)

如何提供直接创建适当类型实例的静态辅助方法?

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。)