Lets say...
<T, S extends T> void work(final Class<T> type, fin开发者_如何学JAVAal S object) {}
or
<T> void work(final Class<T> type, final T object) {}
How can I pass following parameters to work()?
final Class<?> type = <not null> // This is actually an reflection output.
final Object object = <not null>
assert type.isInstance(object); // this is absolutely guaranteed
work(type, type.cast(object)); // compile error; how can I do this?
work(type, object); // compile error; how can I do this?
You'd need a Class<T> for this to work, but you can get that. Once you have that, you can simply do this:
work(type, type.cast(object));
Now, since you've got a Class<?> you can't simply assign it to a Class<T>, but you can work around this by providing an additional method:
<T> void checkedWork(final Class<T> type, final Object object) {
work(type, type.cast(object));
}
Change final Class<?> type to final Class<Object> type (or to whatever concrete type you have). In your definition you have S extends T but if you pass in Class<?> you'd get T = ? and the compiler could not check whether Object extends ? (since ? could be anything).
Edit:
Alternatively, change work to <T, S> void work(final Class<T> type, final S object) {}.
The compiler cannot check that the object is an instance of type. You can do this at runtime as you have done. The simplest way to get this to compile is to use
final Class type = <not null>
This will give you a warning that the type is unchecked.
加载中,请稍侯......
精彩评论