【问题标题】:How to structure a Java generic class to accept a non-generic constructor argument如何构造 Java 泛型类以接受非泛型构造函数参数
【发布时间】:2019-03-28 22:57:11
【问题描述】:

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

是否可以对其进行重组以实现我的想法? 谢谢。

这是一种可以接受的方法。提供静态辅助方法将字符串转换为字符数组。不像 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"));

【问题讨论】:

    标签: generics types constructor inference


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的建议,但我已经在我对问题的最新更新中认识到了这种可能性。如果必须,我可能会选择该选项,但我希望有一种对用户完全透明的方法。
    • @user2626932:此答案确实基于并且旨在改进您对该问题的最新更新。
    • 我同意。我没有仔细看帖子,对此我深表歉意。这比我建议的解决方法要好。我可能会采用它,但我会等几天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多