日期:2014-05-20  浏览次数:20691 次

关于下溯造型,为什么不安全?String类中的equals方法源码疑问
if (anObject instanceof String) {
String anotherString = (String)anObject;【请问这句代码anobject为什么要强制转换为Sting类型,
有人说以防父类用子类的方法用不到,可是什么情况下父类才能用不到子类的方法呢,请举个例子讲解好吗】
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}

------解决方案--------------------
http://topic.csdn.net/u/20111007/10/f24bc519-6e98-4915-9dcc-467957ab6b31.html
看3楼阿宝前辈的回复
------解决方案--------------------
你这段代码似乎本来就有问题,无法通过编译,触发你这里用的String是你自己重写的String而不是java.lang.String
强制转换为String类型的原因很简单,就是要调用子类比父类多声明的方法
如果anObject不转换为String类型,那么就无法调用String的substring() split()这些Object对象没有的方法
Java code

Object s="abc";
        if(s instanceof String){
            String str=(String)s;
            str.substring(0,1);
            //s.substring(0,1); 不进行类型转换这里编译就报错
        }

------解决方案--------------------
探讨
你这段代码似乎本来就有问题,无法通过编译,触发你这里用的String是你自己重写的String而不是java.lang.String
强制转换为String类型的原因很简单,就是要调用子类比父类多声明的方法
如果anObject不转换为String类型,那么就无法调用String的substring() split()这些Object对象没有的方法
Java code

Object s……

------解决方案--------------------
源码的话string的value是private final修饰的,你把那段代码放到外面当然编译不通过了
String anotherString = (String)anObject;必须要强制转换了,左边string类型右边你用obj明显编译都过不去。
转换成string类型是为了接下来判断的。这段代码主要是判断char数组是不是一样。因为string是用他自己私有的char数组来保存字符串的。大概就这么个意思,更多细节详见源码