我使用以下代码来获取跨度字符串中的所有跨度。

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());
   ...
}


我想将objSpan强制转换为Spanned时遇到以下ClassCastException(第6行)。


  java.lang.ClassCastException:android.text.style.SpellCheckSpan无法
  被强制转换为android.text.Spanned


我怎么解决这个问题?有没有更好的方法来获取跨度字符串中的所有跨度?

最佳答案

使用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

10-06 02:19