Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1627135
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 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提示错误发现的,而我和冯越测试并没出这种情况。记得张老师课上代码时也没有。

原文地址:

阅读(206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~