Java 通用参数作为确切的子类?
Java generic parameter as exact subclass?
假设我们有这样的方法:
public void foo(Class<? extends ClassBar> x) {
...
}
通过修改通用表达式;
< ? extends ClassBar >
是否可以保证ClassBar.class不能被传入但是任何extends ClassBar直接或间接被传入WITHOUT 在运行时抛出异常?
如果你只有一堆 类 扩展 ClassBar
你可以遵循这两种方法。
解决方案一:
让 ClassBar
的所有子 类 扩展自定义 interface
(ClassBar
本身除外),并将方法签名更改为:
public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
...
}
方案二:
使用类似于 的东西,并仅为特定类型提供实例。
例如:
class ClassBar {}
class ClassBarA extends ClassBar{}
class ClassBarB extends ClassBar{}
你的 class
包含 foo
:
class Foo<T extends ClassBar> {
private Foo() {} // private constructor
public static <T extends ClassBarA> Foo<T> instance(T c) {
return new Foo<T>();
}
public static <T extends ClassBarB> Foo<T> instance(T c) {
return new Foo<T>();
}
public void foo(Class<T> c) {
}
}
在这种情况下,只接受 ClassBarA
的子类
Foo<ClassBarA> foo1 = Foo.instance(this.classBarA);
foo1.foo(ClassBarA.class); // pass
foo1.foo(ClassBar.class); // fail
假设我们有这样的方法:
public void foo(Class<? extends ClassBar> x) {
...
}
通过修改通用表达式;
< ? extends ClassBar >
是否可以保证ClassBar.class不能被传入但是任何extends ClassBar直接或间接被传入WITHOUT 在运行时抛出异常?
如果你只有一堆 类 扩展 ClassBar
你可以遵循这两种方法。
解决方案一:
让 ClassBar
的所有子 类 扩展自定义 interface
(ClassBar
本身除外),并将方法签名更改为:
public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
...
}
方案二:
使用类似于
例如:
class ClassBar {}
class ClassBarA extends ClassBar{}
class ClassBarB extends ClassBar{}
你的 class
包含 foo
:
class Foo<T extends ClassBar> {
private Foo() {} // private constructor
public static <T extends ClassBarA> Foo<T> instance(T c) {
return new Foo<T>();
}
public static <T extends ClassBarB> Foo<T> instance(T c) {
return new Foo<T>();
}
public void foo(Class<T> c) {
}
}
在这种情况下,只接受 ClassBarA
的子类
Foo<ClassBarA> foo1 = Foo.instance(this.classBarA);
foo1.foo(ClassBarA.class); // pass
foo1.foo(ClassBar.class); // fail