Java泛型参数作为精确子类?
假设我们有这样一种方法:Java泛型参数作为精确子类?,java,reflection,wildcard,Java,Reflection,Wildcard,假设我们有这样一种方法: public void foo(Class如果您只有一堆扩展ClassBar的类,那么您可以遵循这两种方法 解决方案1: 让ClassBar的所有子类扩展自定义接口(除了ClassBar本身),并将方法签名更改为: public <T extends ClassBar & MyInterface> void foo(Class<T> x) { ... } 您的类包含foo: class Foo<T extends Cla
public void foo(Class如果您只有一堆扩展ClassBar
的类,那么您可以遵循这两种方法
解决方案1:
让ClassBar
的所有子类扩展自定义接口
(除了ClassBar
本身),并将方法签名更改为:
public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
...
}
您的类
包含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) {
}
}
因此,唯一的选择是查看它是否是Modifier.isAbstract(x.getModifiers())或者直接检查它是否是ClassBar.class。你是否有很多类扩展了ClassBar
?是的,除了ClassBar
,你想把它们交给foo
方法。我应该在方法内部处理还是有办法在编译时看到它们?好的,我也看到了你的评论late@luk2302您仍然可以通过ClassBar.class
尽管是抽象的
。他特别想过滤对函数的访问ClassBar
将被用作处理程序类的抽象的
基础。因此依赖库可以扩展ClassBar
来实现自己的处理程序。但我认为没有办法编写类似这样的表达式@iGoodie通常处理程序
是接口
,这迫使您有一个实现。我个人会遵循标准模式
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) {
}
}
Foo<ClassBarA> foo1 = Foo.instance(this.classBarA);
foo1.foo(ClassBarA.class); // pass
foo1.foo(ClassBar.class); // fail