我使用下面的代码来获得一个可扩展字符串中的所有跨度。
SpannableStringBuilder str = new SpannableStringBuilder(editText.getText());
Object [] objectSpans = str.getSpans(0, str.length(), Object.class);
//loop through all spans
for (Object objSpan: objectSpans) {
Spanned spanned = (Spanned) objSpan;// Here I encounter a ClassCastException
start = spanned.getSpanStart(new Object());
end = spanned.getSpanEnd(new Object());
...
}当我想将ClassCastException转换为跨(第6行)时,我会遇到下面的objSpan。
java.lang.ClassCastException:不能将android.text.style.SpellCheckSpan转换为android.text.Spanned
我该如何解决这个问题?有没有更好的方法让所有的跨度都是一个可扩展的字符串?
发布于 2019-09-19 09:56:22
使用instanceof代替自动进行转换。
for (Object objSpan: objectSpans) {
if(objSpan instanceof Spanned){
Spanned spanned = (Spanned) objSpan;// Here I encounter a ClassCastException
start = spanned.getSpanStart(new Object());
end = spanned.getSpanEnd(new Object());
...
}
}要理解问题所在,您可以阅读这个ClassCastException Documentation,这样您就可以阅读:
抛出
以指示代码试图将对象强制转换为它不是实例的子类。例如,下面的代码生成一个ClassCastException:
因此,如果要执行cast,必须确保该对象与您声明的对象类型相同,否则将得到一个ClassCastException
发布于 2019-09-19 10:07:47
检查objSpan是否是跨范围的实例。似乎@Skizo是这么认为的,因为mine.therefore对重复的回答感到抱歉,但它也解决了我的问题。
SpannableStringBuilder str = new SpannableStringBuilder(editText.getText());
Object [] objectSpans = str.getSpans(0, str.length(), Object.class);
//loop through all spans
for (Object objSpan: objectSpans) {
if(objSpan instanceof Spanned){
Spanned spanned = (Spanned) objSpan;// Here I encounter a ClassCastException
start = spanned.getSpanStart(new Object());
end = spanned.getSpanEnd(new Object());
...
}
}https://stackoverflow.com/questions/58008311
复制相似问题