Как обрабатывать обнуляемые обобщения с помощью взаимодействия с Java - PullRequest
0 голосов
/ 27 августа 2018

У меня есть класс Java, который находится вне моего контроля и определяется как:

public @interface ValueSource {
    String[] strings() default {}
}

Я пытаюсь использовать этот класс из файла Kotlin, которым я управляю, вот так:

class Thing {
    @ValueSource(string = ["non-null", null])
    fun performAction(value: String?) {
        // Do stuff
    }
}

Я получаю ошибку компилятора

Kotlin: Type inference failed. Expected type mismatch: inferred type is Array<String?> but Array<String> was expected.

Я понимаю, почему выводимый тип Array<String?>, но почему ожидаемый тип не совпадает? Почему Kotlin интерпретирует универсальный Java как String!, а не String?? И, наконец, есть ли способ подавить ошибку?

Котлин 1.2.61

1 Ответ

0 голосов
/ 27 августа 2018

Это не проблема Kotlin - этот код также недопустим, потому что Java просто не допускает значения null в параметрах аннотации:

public class Thing {

    @ValueSource(strings = {"non-null", null}) // Error: Attribute value must be constant
    void performAction(String value) {
        // Do stuff
    }

}

См. эту статью и этот вопрос для дальнейшего обсуждения по этому вопросу.

...