黑马程序员技术交流社区

标题: 判断类型是否匹配时,哪种方式最优雅?高手进。。 [打印本页]

作者: Miss小强    时间: 2013-5-11 11:50
标题: 判断类型是否匹配时,哪种方式最优雅?高手进。。
本帖最后由 Miss小强 于 2013-5-12 10:31 编辑

不多说上代码:
  1. Object obj = new ArrayList();
  2.                
  3.                 //1111111111111111111111111
  4.                 if (obj instanceof ArrayList) {
  5.                         ArrayList list=(ArrayList)obj;
  6.                 }
  7.                 //22222222222222222222222
  8.                 if(obj!=null){
  9.                         if(obj.getClass()==ArrayList.class){
  10.                                 ArrayList list=(ArrayList)obj;
  11.                         }
  12.                 }
复制代码
ps:instanceof关键字是怎么判断的?
作者: 风乐    时间: 2013-5-11 11:54
不懂,占位看高手解答
作者: long    时间: 2013-5-11 12:22
if (obj instanceof ArrayList)该语句会判断obj引用的对象所属的类型是否是ArrayList类或其子类(包含间接子类),如果是判断语句返回true,否则返回false。
作者: 黄玉昆    时间: 2013-5-11 12:35
你这个问题问的有意思
我看了看相关的资料。这里还是有一定的区别的,我个人理解:
对于instanceof的比较,是将obj作为ArrayList的一个实例对象存在的,是通过获取这个对象的类型信息和ArrayList比较是不是属于这个类型,但是,如果你要是换成Object,一样是true的。
而对于比较字节码对象,是从内存中获得的是唯一的那份字节码,比较是不是同一份字节码,但是,如果你换成Object.class的话,就不会是true了。按说这种方式是更精准的,但是一般常用的是instanceof的比较。
这个instanceof其实和“=、<、>”等是一样的,只不过是用字母作为运算符而已。
建议楼主自己再测试一下:


  1.                 //1111111111111111111111111
  2.                 Object obj = new ArrayList();
  3.                 if (obj instanceof ArrayList) {
  4.                         System.out.println(111111);
  5.                         ArrayList list1=(ArrayList)obj;
  6.                 }
  7.                 //22222222222222222222222
  8.                 Object obj2 = new ArrayList();
  9.                 if(obj.getClass()== ArrayList.class){
  10.                         System.out.println("22222");
  11.                         ArrayList list2=(ArrayList)obj2;
  12.                 }
复制代码

作者: 曹睿翔    时间: 2013-5-11 12:49
哈哈,java核心技术书看着不错吧
作者: Miss小强    时间: 2013-5-11 13:04
黄玉昆 发表于 2013-5-11 12:35
你这个问题问的有意思
我看了看相关的资料。这里还是有一定的区别的,我个人理解:
对于instanceof的比较, ...

查了下资料: java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

按照你的建议试了下,确实有不同的效果:
  1. Object obj=new ArrayList();
  2.         if(Object.class==obj.getClass()){
  3.                 System.out.println("==");
  4.         }
  5.         
  6.         if(obj instanceof Object){
  7.                 System.out.println("instance");
  8.         }
复制代码
第二个判断语句竟然执行了 ,不过照这样说的话,instanceof有点不靠谱啊,
不过按常理来说,所有的类都属于Object,应该也可以理解;
还是看具体需求吧。。。有长见识了。。。

作者: Miss小强    时间: 2013-5-11 13:05
曹睿翔 发表于 2013-5-11 12:49
哈哈,java核心技术书看着不错吧

是啊,每天就看几页,然后拼命有道,只能说痛并快乐着。。。有时间你也look look,确实不错的书。。。
作者: 曹睿翔    时间: 2013-5-11 13:48
Miss小强 发表于 2013-5-11 13:05
是啊,每天就看几页,然后拼命有道,只能说痛并快乐着。。。有时间你也look look,确实不错的书。。。 ...

你还看英文版,厉害厉害
我每天看一二十页,去黑马前看完
作者: Miss小强    时间: 2013-5-11 15:05
曹睿翔 发表于 2013-5-11 13:48
你还看英文版,厉害厉害
我每天看一二十页,去黑马前看完

我估摸着也差不多,到后来速度会变快的,云四开班还有一个多月呢。。。
大家一起加油 吧。。。
作者: Miss小强    时间: 2013-5-11 16:15
曹睿翔 发表于 2013-5-11 13:48
你还看英文版,厉害厉害
我每天看一二十页,去黑马前看完

你的是中文版吗?能不能帮我看下第四章:Collections,
中Collection陷阱(Collection Gotchas)小节中的集合问题(Collection Problems)
就是最后一个知识点集合问题讲的是什么意思,看了半天都没看懂。。。不知道什么意思,
不过貌似这里蛮重要的。。。
作者: 曹睿翔    时间: 2013-5-12 09:51
Miss小强 发表于 2013-5-11 16:15
你的是中文版吗?能不能帮我看下第四章:Collections,
中Collection陷阱(Collection Gotchas)小节中的 ...

昨天有事,下午回宿舍我给你看看
作者: Miss小强    时间: 2013-5-12 10:30
曹睿翔 发表于 2013-5-12 09:51
昨天有事,下午回宿舍我给你看看

ok。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2