Ошибка при получении: (55, 41) Kotlin: Ошибка вывода типа - PullRequest
0 голосов
/ 15 апреля 2019

Я получаю Error:(55, 41) Kotlin: Type inference failed. Expected type mismatch: inferred type is (Mutable)List<Optional<Address!>!>! but List<Address>? was expected

Я сохраняю данные в mongoDB Document, который есть в моем build.gradle:

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-hateoas'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'

Объекты моего документа

@Document(collection = "address")
class Address {
    @Id
    var id: String? = null
    var number: String? = null
    var street: String? = null
    var neighborhood: String? = null
    var locality: String? = null
    var region: String? = null
    var country: String? = null
    var code: String? = null
    var google_place_id: String? = null

    constructor()
}

И

@Document(collection = "person")
class Person {
    @Id
    var id: String? = null
    var name: String? = null
    var lastName: String? = null
    var phone: String? = null
    var email: String? = null
    var password: String? = null
    @DBRef(db = "mlm")
    var address: List<Address>? = null

    constructor()
}

У меня есть интерфейсы

@Repository
interface PersonRepository : MongoRepository<Person, String>

И

@Repository
interface AddressRepository : MongoRepository<Address, String>

Мои контроллеры работают
Мой тест Сеялка / лунка действительно, чтобы увидеть, как это сделать, выглядит вот так, и именно здесь я сталкиваюсь с проблемой

class DbSeeder {
    @Autowired
    private val personRepository: PersonRepository? = null
    @Autowired
    private val addressRepository: AddressRepository? = null

    fun addressLoading() {
        val address1 = Address()
        address1.id = "5cb2e9424274072ec4bb4199"
        address1.number = "1"
        address1.street = "Microsoft Way"
        address1.neighborhood = "Redmond"
        address1.locality = "King County"
        address1.region = "Washington"
        address1.code = "425"
        address1.country = "United States"
        address1.google_place_id = "5644+83 Centurion"

        val address2 = Address()
        address2.id = "5cb2e9424274072ec4bb4198"
        address2.number = "1600"
        address2.street = "Amphitheatre Parkway"
        address2.neighborhood = ""
        address2.locality = "Mountain View"
        address2.region = "California"
        address2.country = "United States"
        address2.code = "94043"
        address2.google_place_id = "CWC8+Q9 Mountain View, California, USA"

        val address = Arrays.asList(address1, address2)
        this.addressRepository!!.insert(address)
    }

    fun personLoading() {
        val personDocument = Person()
        personDocument.id = "5cb2e9424274072ec4bb4197"
        personDocument.name = "William"
        personDocument.lastName = "Gates"
        personDocument.phone = "1081010810"
        personDocument.email = "bill.gates@gmail.com"
        personDocument.password = "bill-secret"

        val personAddressDBRef = addressRepository!!.findById("5cb2e9424274072ec4bb4199")

        personDocument.address = Arrays.asList(personAddressDBRef)

    //  val personDBRef = personRepository!!.save(personDocument)  // If the ObjectID is requires else ware
        personRepository!!.save(personDocument)
    }
}

чтобы сохранить мой адрес, мне нужно найти адрес, связанный с ObjectID, затем сохранить ObjectID как DBRef в человеке Document

val personAddressDBRef = addressRepository!!.findById("5cb2e9424274072ec4bb4199")
personDocument.address = Arrays.asList(personAddressDBRef) // << Error here

В последней строке я получаю ошибку Error:(55, 41) Kotlin: Type inference failed. Expected type mismatch: inferred type is (Mutable)List<Optional<Address!>!>! but List<Address>? was expected Кажется, я понятия не имею, как поступить
Я сделал это доступным на GitHub https://github.com/Morons/gofetchbyidandinsertdbref.git
Любая помощь будет оценена

1 Ответ

0 голосов
/ 15 апреля 2019

Вам нужно прочитать https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types, чтобы понять, как пишется выведенный тип.Но проблема достаточно проста:

  1. personAddressDBRef имеет тип Optional<Address>, потому что это то, что findById возвращает.

  2. Итак Arrays.asList(personAddressDBRef) is List<Optional<Address>> (опять же, см. ссылку выше, почему вы видите более сложный тип).

  3. Вы не можете установить personDocument.address в List<Optional<Address>>, вам нужноList<Address> вместо.

Так что вам нужно решить, как преобразовать Optional<Address> в List<Address>.Один из способов будет

personDocument.address = personAddressDBRef.map { listOf(it) }.orElseGet { listOf() }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...