Suppose I am keeping a registry of subclasses of a certain class, T
:
public class ClassRegistry<T> { Set<Class<? extends T>> klasses; ... public void register(Class<? extends T> klass) { klasses.add(klass); }
You register yourself with a call like registry.register(this.getClass())
. I would like to make this simpler with a method on ClassRegistry<T>
where you just pass yourself, this
, e.g., registry.register(this)
:
public void register(Object obj) { Class<?> klass = obj.getClass(); this.register(klass); }
Oops, this is wrong, because it calls itself (matching the overload with parameter type Object
and not, of course, Class<? extends T>
). So, instead:
public void register(Object obj) { Class<? extends T> klass = obj.getClass(); this.register(klass); }
And now of course that doesn't compile because the compiler doesn't know that your obj
is actually of some type ? extends T
. And it might not, at that, because the caller might be wrong.
So my question is: How do I test/validate that obj
is a subclass of T
which is a wildcard upper bound (so I can safely cast)? (I suspect - or maybe, hope - the answer involves Guava's TypeToken
, which is why I added the Guava tag, but I'll take any answer, thanks!)
Aucun commentaire:
Enregistrer un commentaire