【问题标题】:AndroidStudio refuses to acknowledge inheritance hierarchyAndroid Studio 拒绝承认继承层次结构
【发布时间】:2019-01-26 22:13:58
【问题描述】:

这是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
    ...
}

错误变成警告

这个演员永远不会成功。

但显然,确实如此。

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

【问题讨论】:

    标签: android json inheritance kotlin


    【解决方案1】:

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

    这不太可能奏效。

    这是为什么呢?

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

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

    删除implementation 'org.json:json:20180813'。要么:

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

    【讨论】:

    • 我实际上是专门添加了它,因为 AndroidStudio 抱怨我应该为我的 JUnitTests 模拟框架。那么将不得不查看不同的解析器。
    • 对于真正的单元测试(test/ 目录),您将使用testImplementation,而不是implementation。如果org.json API 发生了变化,你仍然可能会遇到兼容性问题(我不知道它是否发生了变化)。
    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多