我有一个名为Bar
的接口,并且在是 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);
}
}
我试图添加一个专门的构造函数,要求它的实际方法参数 都是Bar
和 {{1}我可以从特殊的构造函数中调用我的通用构造函数:
enum
答案 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<?>>