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

时间:2017-12-19 14:51:25

标签: java generics constructor bounds

我有一个名为Bar的接口,并且在 Foo的类型上参数化了一个通用类Bar

class Foo<B extends Bar> { }

我的班级有一个通用构造函数,它带有ClassStream

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

我试图添加一个专门的构造函数,要求它的实际方法参数 都是Bar {{1}我可以从特殊的构造函数中调用我的通用构造函数:

enum

3 个答案:

答案 0 :(得分:6)

一般来说,您可以编写通用构造函数。我们最近有a question about them, and how they might be useful。通过这种方式,您可以提供一个构造函数,该类将一个类作为参数,该类表示一个类,该类既扩展了某个特定的其他类又实现了接口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,特殊的通用构造函数无法调用常规构造函数。 / p>

但是可以使用工厂方法而不是特殊构造函数来执行此操作:

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

答案 1 :(得分:5)

我认为你不能用构造函数来做。创建子类:

class EnumFoo<B extends Enum<B>&Bar> extends Foo<B> {
    public EnumFoo(Class<B> clazz) {
        super(clazz, Arrays.stream(clazz.getEnumConstants()));
    }
}

或工厂方法:

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

答案 2 :(得分:-4)

这可以通过使用&amp;运营商:<Something extends Bar & Enum<?>>