如何构建 Java 泛型 class 以接受非泛型构造函数参数

How to structure a Java generic class to accept a non-generic constructor argument

我正在编写一个简单的泛型实用程序 class,它提供一个采用 T[] 参数的构造函数。我想设置第二个构造函数,它接受一个字符串参数,但使用第一个构造函数作为设置的一部分。

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

我希望第二个构造函数将字符串映射到字符数组,然后调用第一个构造函数。

相反,Java 编译器抱怨找不到合适的构造函数。

是否可以重组以实现我的想法? 谢谢。

这是一种可能可以接受的方法。提供一个静态帮助器方法来将 String 转换为 Character 数组。不像 C++ 那样灵活,但它会工作:

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

因此,需要用户使用以下语法来构造class:

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

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

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