Kotlin: вывод типа не выполнен. Ожидаемое несоответствие типов: предполагаемый тип MutableList но MutableCollection <Long>ожидалось - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь создать MutableList с использованием kotlin, но получаю сообщение об ошибке:

Ошибка вывода типа. Ожидаемое несоответствие типов: предполагаемый тип MutableList, но ожидалось MutableCollection

... и я не уверен, как преобразовать MutableList в MutableCollection.

Я пытался использовать:

.toMutableList().toCollection()

, но он ищет пункт назначения - и я не уверен, что делать.

Фрагмент кода:

data class HrmSearchResult(
    var rssi: Short?,
    var adjustRssi: Short?,
    var timeout: Int,
    var serialNumber: Long?,
    var isIn: Boolean,
    var countIn: Int
)

private val hashMapHrm = ConcurrentHashMap<Long?, HrmSearchResult>()

val hrmDeviceList: MutableCollection<Long>
    get() = try {
        if (hashMapHrm.elements().toList().none { it.isIn}) {
            //if there are no member in range, then return empty list
            arrayListOf()
        } else {
            hashMapHrm.elements()
                .toList()
                .filter { it.isIn }
                .sortedByDescending { it.adjustRssi }
                .map { it.serialNumber }
                .toMutableList().toCollection()
        }
    } catch (ex: Exception) {
        AppLog.e(
            LOG, "Problem when get devices " +
                    "return empty list: ${ex.localizedMessage}"
        )
        arrayListOf()
    }

Любые предложения приветствуются.

1 Ответ

1 голос
/ 26 марта 2020

Проблема заключается в обнуляемости, а не в типе коллекции, то есть в том, что вы создаете List<Long?>, где ожидается List<Long>.

Вы можете воспроизвести сообщение об ошибке (inferred type is MutableList<Long?> but MutableCollection<Long> was expected) минимально с это:

val foo: MutableCollection<Long> =
    listOf(1L, 2, 3, 4, null)
        .toMutableList()

И вы можете исправить это, вставив .filterNotNull(), чтобы удалить потенциальные нули, и преобразовать List<T?> в List<T>:

val foo: MutableCollection<Long> =
    listOf(1L, 2, 3, 4, null)
        .filterNotNull()
        .toMutableList()

(Таким образом, ваш .toCollection() вызов на самом деле не нужен и может быть отброшен)

Некоторые другие примечания указывают c для вашего кода:

Возможно, вы захотите использовать .values вместо .elements.toList(), и map { }.filterNotNull() можно объединить в mapNotNull, поэтому в итоге вы, вероятно, захотите написать свою цепочку как

hashMapHrm.values
    .filter { it.isIn }
    .sortedByDescending { it.adjustRssi }
    .mapNotNull { it.serialNumber }
    .toMutableList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...