为什么要按原样定义SpannableString相等性?

问题描述

请考虑以下测试:

    @Test
    fun test() {
        val s1 = SpannableString("Test")
        val s2 = SpannableString("Test")
        s1.setSpan(StyleSpan(BOLD),s1.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        s2.setSpan(StyleSpan(BOLD),s2.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

        assertEquals(s1,s2)
    }

它成功还是失败?

我的假设是它应该成功,但是失败(抓挠头)。在查看SpannableStringInternal的实现时,我们看到该函数将每个范围与其对应范围进行比较(假设我们具有相等数量的范围)。

 // Same as SpannableStringBuilder
    @Override
    public boolean equals(Object o) {
        if (o instanceof Spanned &&
                toString().equals(o.toString())) {
            final Spanned other = (Spanned) o;
            // Check span data
            final Object[] otherSpans = other.getSpans(0,other.length(),Object.class);
            final Object[] thisSpans = getSpans(0,length(),Object.class);
            if (mSpanCount == otherSpans.length) {
                for (int i = 0; i < mSpanCount; ++i) {
                    final Object thisSpan = thisSpans[i];
                    final Object otherSpan = otherSpans[i];
                    if (thisSpan == this) {
                        if (other != otherSpan ||
                                getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
                                getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
                                getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
                            return false;
                        }
                    } else if (!thisSpan.equals(otherSpan) ||
                            getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
                            getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
                            getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
                        return false;
                    }
                }
                return true;
            }
        }
        return false;
    }

else if中的第一个条件比较了Span对象是否相等,并且样式跨度(尽管编码相同的数据且类型相同)不相等,因为看起来StyleSpan确实不覆盖等于。

为什么没有将这两者视为相等的特定原因,或者这是Android中的错误?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)