AndroidStudio отказывается признать иерархию наследования - PullRequest
0 голосов
/ 27 января 2019

Это с 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
    ...
}

ошибка становится предупреждением, что

Этот акт никогда не может быть успешным.

Но, видимо, так и есть.

Почему это? И как мне избавиться от этой "ошибки"?

1 Ответ

0 голосов
/ 27 января 2019

Это с реализацией 'org.json: json: 20180813'

Это вряд ли будет хорошо работать.

Почему это так?

В течение последних 11 лет в Android SDK есть копия org.json классов. Это включает JSONStringer.У вас не может быть двух классов с одинаковым полностью определенным именем, и прошивка всегда выигрывает.Ваша копия конфликтующего класса не будет использоваться, вместо нее будет использована прошивка.И API прошивки за последние 11 лет не сильно изменился.

И как мне избавиться от этой "ошибки"?

Удалить implementation 'org.json:json:20180813'.Либо:

  • Используйте встроенные в Android SDK org.json классы, либо
  • Используйте Android SDK JsonReader и JsonWriter классов, либо
  • Используйте другой анализатор JSON (например, Gson, Jackson, Moshi)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...