nutzam/nutz — Issue #80: Mirror导致的泛型丢失
Author: juqkai
Created: 2011-10-23 09:13:27+00:00
State: open

这个可能跟 #79 有一定的关系吧. 我语言表述上不是很清楚

现在 nutz 中我们对class使用mirror做了一层封装. 注入的时候基本上都依赖于它.

但是在大部分的情况下, 使用mirror都会导致泛型的丢失. 如:
List users = new ArrayList();
Mirror.me(users.getClass);
通过上面的语句, 会生成一个mirror的实现. 然后通过API可以得知 getClass 是 Object 所定义, 其返回类型是 Class. 就这样, 导致了ArrayList -> ArrayList的泛型丢失过程.

可惜的是, 在 nutz 中, 大部分都是使用的上面的方式来进行处理. 尽管有几处地方因为业务需要使用了 ParameterizedType 但是, 感觉完全不够, 因为 nutz 核心并未提供这方面的支持.

翻了一下 API, 设了一些断点, 做了一些调试, 始终没在 Class 中找到能找回其泛型的方式. 这就有点纠结了...也没找到什么好的解决方案.

所以倡导一下, 尽量在必要的时候(非所有)使用Type 而非Class,
如在取得 Field 的时候, 别使用 getType() 这类返回 Class 的方法来生成 Mirror. 而是使用 getGenericType() 方法生成 Mirror.
在取得Method的返回类型, 参数类型的时候别使用getReturnType(), 而是使用getGenericReturnType()
等等, 尽可能的保证数据类型的完整.

另外, 我在做 #30 的时候对 Mirror, Lang做了一小点扩展, 主要也是针对对 Type 的支持的. 但是感觉还不够, 所以在这里提出来, 看看大家有没有更好的实现,封装方式.

另外, 感觉 Mirror 中的 getGenericTypes(Field f)实现并不怎么合理样. getTypeParams(Class klass)方法也不能取得泛型, 只能得到申明类型而...