1
TextView *textview = (TextView*)v.get();
sp<android::text::CharSequence> chars = textview->getText();sp<android::text::String> str = chars->toString();
2
android::sp<android::text::String> str = static_cast<android::text::String*>((static_cast<TextView*>(v.get()))->getText().get());
3
android::sp<android::text::String> str = (static_cast<TextView*>(v.get()))->getText()->toString();
CharSequence为String的父类,为抽象类,此处1和3等价,而1和2不等价,2的转换是错误的
原因是此处CharSequence的真实类型是SpannableStringBuilder,而非String,此处2用dynamic_cast也不可以,2个子类并不相互继承
因此遇到CharSequence,不能确定其真实类型的时候,绝对不要随便转换为你想要的类型,是它的子类,但不一定就是它的真实类型
sp<String> SpannableStringBuilder::toString() const
{
#if 0
int len = length();
//wchar_t buf[len];
char buf[len];
getChars(0, len, buf, 0);
//return *(new std::string(buf));// pay attention
std::string s1(buf);
return s1;
#else
return mText->toString();
#endif
}
sp<String> CharArray16::toString() const
{
char *utf8 = cn_utf16_to_utf8(mArray, mLength, NULL, NULL);
if (utf8 == NULL) {
return NULL;
}
sp<String> str = new String(utf8);
free(utf8);
return str;
}