在 Java 泛型 class 中,在构造函数级别添加额外的泛型约束?
In Java generic class, add extra generic constraints at constructor level?
我有一个名为 Bar
的接口和一个通用 class Foo
参数化的类型 是 Bar
:
class Foo<B extends Bar> { }
我的 class 有一个通用构造函数,它接受一个 Class
和一个 Stream
:
class Foo<B extends Bar> {
B[] bs;
Foo(Class<B> clazz, Stream<B> stream) { // General ctor
bs = someFunctionOf(clazz, stream);
}
}
我正在尝试添加一个专门的构造函数,它要求其实际方法参数 both 是 Bar
and 一个 enum
class 这样我就可以从特殊构造函数调用我的通用构造函数:
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());
}
}
这可以通过使用 & 运算符来实现:<Something extends Bar & Enum<?>>
我不认为你可以用构造函数来做到这一点。创建子类:
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()));
}
一般来说,您可以编写泛型构造函数。我们最近 。通过这种方式,您可以提供一个构造函数,该构造函数将表示 class 的 Class 作为参数,它既扩展了一些特定的其他 class 又实现了接口 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
需要是显式类型。 class的类型参数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()));
}
}
我有一个名为 Bar
的接口和一个通用 class Foo
参数化的类型 是 Bar
:
class Foo<B extends Bar> { }
我的 class 有一个通用构造函数,它接受一个 Class
和一个 Stream
:
class Foo<B extends Bar> {
B[] bs;
Foo(Class<B> clazz, Stream<B> stream) { // General ctor
bs = someFunctionOf(clazz, stream);
}
}
我正在尝试添加一个专门的构造函数,它要求其实际方法参数 both 是 Bar
and 一个 enum
class 这样我就可以从特殊构造函数调用我的通用构造函数:
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());
}
}
这可以通过使用 & 运算符来实现:<Something extends Bar & Enum<?>>
我不认为你可以用构造函数来做到这一点。创建子类:
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()));
}
一般来说,您可以编写泛型构造函数。我们最近 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
需要是显式类型。 class的类型参数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()));
}
}