java - 在 Java 泛型类中,在构造函数级别添加额外的泛型约束?

标签 java generics constructor bounds

我有一个名为 Bar 的接口(interface)和一个泛型类 Foo 参数化的类型是一个 Bar :

class Foo<B extends Bar> { }

我的类有一个通用构造函数,它接受一个 Class 和一个 Stream:

class Foo<B extends Bar> {
    B[] bs;
    Foo(Class<B> clazz, Stream<B> stream) { // General ctor
        bs = someFunctionOf(clazz, stream);
    }
}

我正在尝试添加一个专门的构造函数,它要求它的实际方法参数 both 是一个 Bar 一个 enum 类,以便我可以从特殊构造函数调用我的通用构造函数:

class Foo<B extends Bar> {
    B[] bs;
    Foo(Class<B> clazz, Stream<B> stream) { // General ctor
        bs = someFunctionOf(clazz, stream);
    }
    // FIX THIS ----+
    //              |
    //              ˅
    Foo(Class<Something> clazz) { // Special ctor
        // Can we make this work so Something is a Bar and an enum
        // and we can call the other constructor like this?
        this(clazz, Arrays.stream(clazz.getEnumConstants());
    }
}

最佳答案

一般来说,您可以编写泛型构造函数。我们最近有 a question about them, and how they might be useful .通过这种方式,您可以提供一个构造函数,该构造函数将表示一个类的类作为参数,该类既扩展了一些特定的其他类又实现了接口(interface) Bar:

class Foo<B extends Bar> {
    B[] bs;
    Foo(Class<B> clazz, Stream<B> stream) { // General ctor
        bs = someFunctionOf(clazz, stream);
    }

    private B[] someFunctionOf(Class<B> clazz, Stream<B> stream) {
        return null;
    }

    <T extends SomeClass & Bar> Foo(Class<T> clazz) {
        // ...
    }
}

但这并不能完全让您到达想要的位置,因为构造函数的类型参数 T 的边界需要是显式类型。类的类型参数 B 等类型变量不提供服务,并且没有将 T 连接到 B 的方法,特殊的泛型构造函数无法调用通用构造函数。

但是您可以使用工厂方法而不是特殊的构造函数来做到这一点:

class Foo<B extends Bar> {
    B[] bs;
    Foo(Class<B> clazz, Stream<B> stream) { // General ctor
        bs = someFunctionOf(clazz, stream);
    }

    private B[] someFunctionOf(Class<B> clazz, Stream<B> stream) {
        return null;
    }

    static <T extends Enum<T> & Bar> Foo<T> createEnumFoo(Class<T> clazz) {
        return new Foo<>(clazz, Arrays.stream(clazz.getEnumConstants()));
    }
}

关于java - 在 Java 泛型类中,在构造函数级别添加额外的泛型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47889540/

相关文章:

typescript - React-redux 与 TypeScript Hook

javascript - 当像 new(Date) 这样写时,你如何将参数传递给构造函数?

python - 在 Python 类构造函数中只允许一对参数中的一个的最佳方法是什么?

Java继承: Why calling a method at the parent constructor level,调用重写的子方法?

java - 如何从字符串中获取经过的年数

java - 不确定的 ProgressBar 在对话框的一部分时不设置动画 (JavaFX 10)

标题的 Java XML 打印节点

Java EE 6 框架

java - java中未指定泛型和<?>之间的编译差异

c# - RegisterOpenGeneric with SimpleInjector 解析不正确的类型