分类: IT职场
2012-12-13 09:41:46
这个问题是我们组的冯越发现的,他的基础非常好,学习一些新知识的时候研究的很仔细
首先,用pull方法解析XML文件时要取得一个解析器的实例,如下:
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
但XmlPullParser只是个接口,返回的实际上是XmlPullParser的实现类KXmlParser的一个实例,这也就是面对对象中最常用的父类变量指向子类对象
在这种情况下,parser作为一个父类变量,只能调用父类定义方法,看不到子类自己定义的方法
但冯越看了XmlPullParser这个jar包的API文档和源码,发现XmlPullParser并没有定义setInput(InputStream arg0, String
arg1)和.nextText()这两个方法,但是却可以用parser这个变量来调用这两个方法
这明显违背了前面说的面对对象原则,这是不可能的!
看着冯越坐立不安有些抓狂的样子,再听到他叨咕出那句“这简直颠覆了我的面对对象的XXX(记不准他原话了)”,不由得让我想起《三体》第一部(非常精彩的科幻小说,建议有时间的兄弟看看)里因为出现了颠覆量子物理理论基础现象而自杀的科学家,我也跟着翻看了XmlPullParser和KXmlParser这两个jar包的API文档和源码,一样没什么发现,最后还是请教了张老师才解决了这个疑问。
原来,XmlPullParser的jar包定义了的三个接口(或类)在KXmlParser这个jar包里有一套完全相同的定义,只是多了那两个方法,而KXmlParser的源码和API里却没有这部分,难怪我们怎么查看源码也没什么发现。
这一点在导入了两个包后,可以在“打开类型”窗口中看到,如下图,两个包都有XmlPullParser这个接口
而KXmlParser这个jar包里定义的XmlPullParser接口多了那两个方法,所以难怪可以用父类的变量直接调用了
也就是只要导入KXmlParser这一个jar包就可以使用pull解析XML,
---------------
后注:今天晚饭时和两个同组的兄弟说起这个问题,发现他们都知道了只导KXmlParser这一个包就可以,但他们是因为同时导入两个包出现setInput提示错误发现的,而我和冯越测试并没出这种情况。记得张老师课上代码时也没有。
原文地址: