首页 > 解决方案 > AndroidStudio 拒绝承认继承层次结构

问题描述

这是与implementation 'org.json:json:20180813'

所以我有一个User类,它允许将自己转换为 json 字符串以实现持久性:

data class User(override val name:String, override val creds:ICredentials) : IUser, isEncodable<IUser>{
    override val isLoggedIn by lazy { creds is Credentials.Valid }

    override fun encode():String{
        val credsEncoding = creds.encode()

        return JSONStringer().withObject { it
                .key("type").value(this::class.java.name)
                .key("name").value(name)
                .key("creds").value(credsEncoding)
        }.toString()
    }
}

withObject扩展函数在哪里:

fun JSONWriter.withObject(content:(JSONWriter)->JSONWriter) = content(`object`() as JSONWriter).endObject()

这似乎编译和工作得很好。

但是,AndroidStudio 将其标记为红色并声称

未解决的参考

由于接收器类型不匹配,以下候选均不适用

public fun JSONWriter.withObject(content:(JSONWriter)->JSONWriter):JSONWriter! defined in [...]`

如果我尝试“作弊”并将其写为

(JSONStringer() as JSONWriter).withObject { it
    ...
}

错误变成警告

这个演员永远不会成功。

但显然,确实如此。

这是为什么?我该如何摆脱这个“错误”?

标签: androidjsoninheritancekotlin

解决方案


这是与实现 'org.json:json:20180813'

这不太可能运作良好。

这是为什么?

在过去的 11 年里,Androidorg.json在 Android SDK 中有一个类的副本。这包括JSONStringer. 您不能有两个具有相同完全限定名称的类,并且固件总是获胜。将不会使用您的冲突类副本,而是使用固件副本。在过去的 11 年里,固件的 API 并没有太大变化。

我该如何摆脱这个“错误”?

删除implementation 'org.json:json:20180813'. 任何一个:

  • 使用 Android SDK 的内置org.json类,或
  • 使用 Android SDKJsonReaderJsonWriter类,或
  • 使用不同的 JSON 解析器(例如,Gson、Jackson、Moshi)

推荐阅读