在official Guava's TypeToken
wiki中,有以下示例:
Invokable<List<String>, ?> invokable = new TypeToken<List<String>>() {}.method(getMethod);
invokable.getReturnType(); // String.class
如何设置getMethod
?
我尝试了以下示例:
首先尝试:
List<String> list = new ArrayList<String>();
Class[] arg = { int.class };
Method getMethod = list.getClass().getMethod("get", arg);
Invokable<List<String>, ?> invokable = new TypeToken<List<String>>() {}.method(getMethod);
System.out.println(invokable.getReturnType());
它崩溃了以下消息:
Exception in thread "main" java.lang.IllegalArgumentException: public java.lang.Object java.util.ArrayList.get(int) not declared by java.util.List<java.lang.String>
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
at com.google.common.reflect.TypeToken.method(TypeToken.java:495)
at tmp.LaunchClass.main(LaunchClass.java:28)
第二次尝试(尽管有点不同):
List<String> list = new ArrayList<String>();
Class[] arg = { int.class };
Method getMethod = list.getClass().getMethod("get", arg);
// changed here
Invokable invokable = TypeToken.of(list.getClass()).method(getMethod);
System.out.println(invokable.getReturnType());
不会崩溃,但不会返回预期结果。退回E
。预期结果:String.class
(如在官方维基中)。
答案 0 :(得分:3)
您正试图从get
获取方法ArrayList
。你应该从List
获得它。
Class<?> clazz = List.class;
Method getMethod = clazz.getMethod("get", int.class);
TypeToken#method(Method)
州的javadoc
返回
Invokable
的{{1}},method
必须是T
的成员。
其中T
是TypeToken
中声明的类型变量。