Невозможно добавить критерий API-предиката в Kotlin, ошибка при получении интерфейса типа. - PullRequest
0 голосов
/ 21 января 2020

У меня очень раздражающая проблема, которую я не могу решить, и я предполагаю, что упускаю что-то действительно прямое, потому что у меня уже есть рабочий код в Java.

По сути, у меня есть это :

class ConfigurationSpecification(
        private var list: MutableList<SearchCriteria> = mutableListOf()
) : Specification<Configuration> {
    override fun toPredicate(root: Root<Configuration>, query: CriteriaQuery<*>, builder: CriteriaBuilder): Predicate? {
        val predicates: MutableList<Predicate> = mutableListOf()

        for (criteria in list) {
            if (criteria.operation == "EQUALS") {
                predicates.add(builder.equal(root.get(criteria.key), criteria.value)) <- NOT WORKING root.get(criteria.key) this is making issue
            }
        }

        return builder.and(predicates[0])
    }
}

Код действительно прост, но по какой-то причине Kotlin жалуется на это, я получаю следующую ошибку:

Ошибка: (19, 51) Kotlin: Вывод типа не выполнен: недостаточно информации для вывода параметра Y в fun get (p0: String!): Path! Пожалуйста, укажите это явно.

И это работает java код:

predicates.add(builder.equal(root.get(criteria.getKey()), criteria.getValue())); <- working with Java

Любой опытный Kotlin человек, который знает обходной путь для этой ошибки? Я видел, что у некоторых других людей были подобные проблемы, но я не могу исправить это, основываясь на ответах, которые я видел.

1 Ответ

1 голос
/ 21 января 2020

Из документов:

Путь get (String attributeName)

Создание пути, соответствующего указанному атрибуту.

Примечание: Приложениям, использующим API на основе строк, может потребоваться указать тип, полученный в результате операции get, чтобы избежать использования переменных Path.

Чтобы исправить ошибку, необходимо указать generi c введите явно, потому что Kotlin компилятор не может вывести его из контекста:

predicates.add(builder.equal(root.get</* type of criteria.value */>(criteria.key), criteria.value))
...