【发布时间】:2015-08-28 18:26:46
【问题描述】:
假设我保留了某个类的子类的注册表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> 上的一个方法让这更简单,你只需传递自己,this,例如,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? -
有趣的想法 - 如果
T=Class怎么办? :) -
@LouisWasserman - 呃,因为脑子放屁?无论如何,为了知道而忽略它:我仍然想知道它是如何完成的,因为我可能有其他理由知道。
标签: java generics reflection guava type-erasure