BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #35631同步于 2014/10/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java中instanceof用法中的疑问,求大神指导解答!谢谢!

chenhebing
2014/10/27镜像同步17 回复
在java疯狂讲义上看到如下代码: if(objPri instanceof String) { String str=(String)objPri; } 用来在类型装换前判断是否可以转换成功。 对于instanceof的用法,按这个意思来说,如果转换不成功,那么返回false。 但是如果前一个类不是后面的类型,也不是他的子类,程序编译出错是怎么回事? 疯狂讲义上还有一段代码,写的是: String a="hello"; System.out.println((a instanceof Math)); 编译上面代码会报错,那么如果: String a="hello"; if(a instanceof String) { Math m=(Math)a; } 这样也会报错,那么这个if语句就形同虚设了啊。如果不是,那么什么时候返回false? 求大神解答,谢谢!!!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
taoch机器人#1 · 2014/10/27
“但是如果前一个类不是后面的类型,也不是他的子类,程序编译出错是怎么回事?” 就是如此,跨类型的转型你得自己写个Adapter之类的东西 后面那个例子,编译期是能够知道a对象的确切类型的,发现和Math八竿子打不着,就会报编译错误组织你这么干。(这句话不保证正确性,仅仅是站在编译角度设想了一下。。。其实我感觉不阻止也可以,java的类型信息实际上在运行期而不是编译期确定的,完全可以放过去让其在运行时候跑类型转化异常) 但假如以下几种情况: a对象声明成Object类型、或a对象是从没有定义类型信息的容器中取出的对象(其实也是Object...)、或a声明的是父类类型,这时候这句话是可以通过编译的,在运行期是可能会有多态的。通过父类引用建立的对象在执行过程中,有时候不得不用这种方法判定当前父类引用指向的那个对象是哪个子类的。 【 在 chenhebing (hello,你好) 的大作中提到: 】 : 标 题: java中instanceof用法中的疑问,求大神指导解答!谢谢! : 发信站: 北邮人论坛 (Mon Oct 27 19:40:21 2014), 站内 : : : 在java疯狂讲义上看到如下代码: : if(objPri instanceof String) : { : String str=(String)objPri; : } : 用来在类型装换前判断是否可以转换成功。 : 对于instanceof的用法,按这个意思来说,如果转换不成功,那么返回false。 : 但是如果前一个类不是后面的类型,也不是他的子类,程序编译出错是怎么回事? : 疯狂讲义上还有一段代码,写的是: : String a="hello"; : System.out.println((a instanceof Math)); : 编译上面代码会报错,那么如果: : String a="hello"; : if(a instanceof String) : { : Math m=(Math)a; : } : 这样也会报错,那么这个if语句就形同虚设了啊。如果不是,那么什么时候返回false? : 求大神解答,谢谢!!! : -- : : ※ 来源:·北邮人论坛 http://bbs.byr.cn·[FROM: 10.102.6.*]
nuanyangyang机器人#2 · 2014/10/28
【 在 chenhebing 的大作中提到: 】 : 在java疯狂讲义上看到如下代码: : if(objPri instanceof String) : { : ................... 所谓“a能成功转换为C”指的是a的类是C、或者是C的子类,或者实现了C接口。 java里面每个对象都有一个类,这个类在对象创建的瞬间和对象绑定,永远不能变。所谓的“type cast”只是“把它当成某个类的实例处理”而已。
ocean2706机器人#3 · 2014/10/28
a instanceof string 应该不会报错吧。报错的是里面的类型转换,可以看一下报错的log日志。如果你觉得if没有用的话,在if语句里面和外面都打个log,通过log来判断if是否执行是最好的方法。
taoch机器人#4 · 2014/10/28
我原来以为也不报错,看到lz帖子自己在eclipse里试了下,报的是和没写分号一样的错误,就是大圆圈那种。。。换成正确的类型就不报错了。 【 在 ocean2706 (【安静的美男子】猫富贵,勿相喵~) 的大作中提到: 】 : a instanceof string 应该不会报错吧。报错的是里面的类型转换,可以看一下报错的log日志。如果你觉得if没有用的话,在if语句里面和外面都打个log,通过log来判断if是否执行是最好的方法。
GacktCamui机器人#5 · 2014/10/28
已经明确知道a是String类型了,并且String对象肯定不是Math类的一个实例,哪里还需要多此一举判断一次,这么写不是浪费程序运行时间么 拿一个Object对象或者实现了某个接口却又不知道实现类到底是什么的对象时,才用instanceof来判断呢…… Object a="hello";这种写法就会导致a的具体类型不确定的,可以用instanceof来判断
ocean2706机器人#6 · 2014/10/28
难道不是这个吗 Cannot cast from String to Math。系统会预编译的发现不是父子、实例关系肯定报错的。 【 在 taoch 的大作中提到: 】 : 我原来以为也不报错,看到lz帖子自己在eclipse里试了下,报的是和没写分号一样的错误,就是大圆圈那种。。。换成正确的类型就不报错了。 :
taoch机器人#7 · 2014/10/28
我昨天自己在编译器里报的不是这个,不是那种小叉的错,直接一个大红叉的错,忘了写的什么 【 在 ocean2706 (【安静的美男子】猫富贵,勿相喵~) 的大作中提到: 】 : 难道不是这个吗 Cannot cast from String to Math。系统会预编译的发现不是父子、实例关系肯定报错的。
txzhb机器人#8 · 2014/10/28
LZ后面的代码是不是想写 if(a instanceof Math) { Math m=(Math)a; }
txzhb机器人#9 · 2014/10/28
instanceof 用在父类向子类转化的时候吧。一个父类有多个子类,用instanceof看它具体是哪一个子类。