Hi, I know, this is too late, but I want to share my suggestion: public <T extends AccessibleObject&AnnotatedElement> T reflectAs(Class<? super T> expected, MethodHandles.Lookup lookup) Member mr = reflectAs(Member.class, MethodHandles.lookup()); AnnotatedElement ae = reflectAs(AnnotatedElement.class, MethodHandles.lookup()); AnnotatedElement am = reflectAs(Member.class, MethodHandles.lookup()); Field fd= reflectAs(Field.class, MethodHandles.lookup()); Constructor cr = reflectAs(Constructor.class, MethodHandles.lookup()); Method md = reflectAs(Method.class, MethodHandles.lookup()); Field fm= reflectAs(Member.class, MethodHandles.lookup()); Constructor cm = reflectAs(Member.class, MethodHandles.lookup()); Method mm = reflectAs(Member.class, MethodHandles.lookup()); Field fa= reflectAs(AnnotatedElement.class, MethodHandles.lookup()); Constructor ca = reflectAs(AnnotatedElement.class, MethodHandles.lookup()); Method ma = reflectAs(AnnotatedElement.class, MethodHandles.lookup()); Member mf= reflectAs(Field.class, MethodHandles.lookup()); Member mc = reflectAs(Constructor.class, MethodHandles.lookup()); Member mrm = reflectAs(Method.class, MethodHandles.lookup()); AnnotatedElement af= reflectAs(Field.class, MethodHandles.lookup()); AnnotatedElement ac = reflectAs(Constructor.class, MethodHandles.lookup()); AnnotatedElement aem = reflectAs(Method.class, MethodHandles.lookup()); Method mdc = reflectAs(Constructor.class, MethodHandles.lookup());//fails Constructor crm = reflectAs(Method.class, MethodHandles.lookup());//fails Constructor cf = reflectAs(Field.class, MethodHandles.lookup());//fails Field fc = reflectAs(Constructor.class, MethodHandles.lookup());//fails AnnotatedElement as = reflectAs(String.class, MethodHandles.lookup());//fails String ss = reflectAs(String.class, MethodHandles.lookup());//fails String sm = reflectAs(Method.class, MethodHandles.lookup());//fails Regards, Ali Ebrahimi On Mon, Nov 11, 2013 at 1:59 AM, Remi Forax <forax@univ-mlv.fr> wrote:
The is a stupid issue with the signature of MethodHandleInfo.reflectAs, j.l.r.Field, Method or Constructor implement two interfaces Member and AnnotatedElement, with the current signature, the code info.reflectAs(Member.class, lookup) works but the code info.reflectAs(AnnotatedElement.class, lookup) doesn't work.
Because there is no way to do an 'or' between several bounds of a type variable, I think that the signature of reflectAs should be changed from : public <T extends Member> T reflectAs(Class<T> expected, Lookup lookup); to public <T> T reflectAs(Class<T> expected, Lookup lookup);
and the javadoc should be modified to explain that a Member or AnnotatedElement are valid bounds of T.
As a side effect, the signature of MethodHandles.reflectAs(Class<T>, MethodHandle) should be updated accordingly.
There is a workaround, one can write: (AnnotatedElement)info.reflectAs(Member.class, lookup) but it's at best weird.
cheers, Rémi
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev