假设我正在维护一个某个类
当然,现在它不能编译,因为编译器不知道您的
所以我的问题是:如何测试/验证
T
的子类注册表:public class ClassRegistry<T> {
Set<Class<? extends T>> klasses;
...
public void register(Class<? extends T> klass) {
klasses.add(klass);
}
你可以通过 registry.register(this.getClass())
的方式进行注册。我想通过在 ClassRegistry<T>
上提供一个方法来简化这个过程,让你只需要传递自己即可,例如 registry.register(this)
:
public void register(Object obj) {
Class<?> klass = obj.getClass();
this.register(klass);
}
糟糕,这是错误的,因为它在调用自身(匹配参数类型为Object
的重载版本,而不是当然的Class<? extends T>
)。 因此,应该改成:
public void register(Object obj) {
Class<? extends T> klass = obj.getClass();
this.register(klass);
}
当然,现在它不能编译,因为编译器不知道您的
obj
实际上是某种类型? extends T
。而且可能并不知道,因为调用者可能是错误的。所以我的问题是:如何测试/验证
obj
是T
的子类,它是通配符上限(因此我可以安全地进行强制转换)?(我怀疑 - 或者说,希望 - 答案涉及Guava的TypeToken
,这就是为什么我添加了Guava标签,但我会接受任何答案,谢谢!)
register
接受一个Object
而不是一个T
? - Louis WassermanT=Class
会怎样? :) - ZhongYu