如何构建 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
。 )
我正在编写一个简单的泛型实用程序 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
。 )