Java / Android自动解析泛型类型。要求分步指导理解

时间:2013-09-26 06:39:22

标签: java android generics

我最近正在研究一些Android代码(这应该是一个通用的Java问题 - 请原谅双关语 - 关于泛型和Java自动解析类型)。

这是我的代码(基于Android,但如果需要,请创建一个特定于Java的版本)

class ViewFinder<T extends View> {

    @SuppressWarnings("unchecked")
    final static <T> T byId(View view, int resource) {

        return (T) view.findViewById(resource);


    }

}

这是有趣的一点......

// Convert XML UI component definitions into the static View Holder object

// Here is what we normally have to do for Android to convert the XML into a UI component
holder.txtGroupName = (TextView) row.findViewById(R.id.txtGroupName);

// This is what I can do with my ViewFinder class above!        
holder.txtGroupName = ViewFinder.byId(row, R.id.txtGroupName);

// This is what I was EXPECTING to do with my ViewFinder class above!       
holder.txtGroupName = ViewFinder<TextView>.byId(row, R.id.txtGroupName);

我不知道Java(不是Android)将Generic T类型解析为TextView UI组件,但为什么和* 如何 *

我可以通过“播放”来了解这里发生的事情吗?我希望能够在下次编写代码之前弄清楚是否会发生这种情况。

1 个答案:

答案 0 :(得分:1)

我的猜测是您正在运行Java 7,请查看:http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

剖析正在发生的事情:Java编译器的部分任务是

  • 解析 - 粗略的语法检查并构建抽象语法树AST。
  • 除草 - 进一步检查AST。
  • TypeValidation - 我认为这是魔术发生的地方,此时AST已经过验证,并且每个节点都会为变量,表达式等添加标记.TypeValidation过程会向节点添加类型并确保这些是正确的。通过Java 7推断类型,我假设这个阶段被扩展为在赋值的右侧自动添加类型,当然有效。当继续下一阶段的事情,如 List<String> str = new ArrayList<>(),已翻译为List<String> str = new ArrayList<String>()
  • ...
  • 最后输出Java Bytcode,其中bonusinfo始终以0xCAFEBABE开头。

希望这是有道理的