Безопасность нулевых типов в коде Reactor в Kotlin и IntelliJ IDEA - PullRequest
2 голосов
/ 04 июня 2019

У меня есть следующий код в моем классе Kotlin:

Mono.just("banana").subscribe({
    println(it)
})

IntelliJ IDEA говорит мне, что переменная "it" в этом случае имеет тип "String!" (см. скриншот).

IntelliJ IDEA screenshot

Я не уверен, что это проблема с Kotlin, IntelliJ IDEA или Reactor, но согласно документации Project Reactor он должен иметь нулевые аннотации, а класс Mono не допускает нулевые значения быть переданным.

Я использую Kotlin версии 1.3.31 и в моем pom.xml есть следующее:

<build>
    <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <configuration>
                <args>
                    <arg>-Xjsr305=strict</arg>
                </args>
                <compilerPlugins>
                    <plugin>spring</plugin>
                </compilerPlugins>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-allopen</artifactId>
                    <version>1.3.31</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

Итак, мой вопрос: почему переменная "it" типа "String!" а не "Строка"?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Проблема здесь в том, что Kotlin рассматривает все типы с ненулевой безопасной платформы (например, Java) как тип платформы, поэтому не имеет значения, что в этом случае говорят документы.Если что-то, что вы пытаетесь использовать (Mono в данном случае), не написано на Kotlin, это будет тип платформы.

Вы можете аннотировать ваши методы Java , чтобы облегчить эту проблему, поэтому вваш случай, я думаю, что Mono не имеет никаких аннотаций из этого списка:

  • JetBrains (@Nullable и @NotNull из пакета org.jetbrains.annotations)
  • Android (com.android.annotations и android.support.annotations)
  • JSR-305 (javax.annotation)
  • FindBugs (edu.umd.cs.findbugs.annotations)
  • Eclipse (org.eclipse.jdt.annotation)
  • Ломбок (lombok.NonNull).
0 голосов
/ 04 июня 2019

Имена типов или имена классов, заканчивающиеся одним восклицательным знаком, называются Типы платформ в Kotlin.В этом случае подписка возвращает Java String без аннотаций, Котлин не знает, может ли это значение быть нулевым или нет.

Вы правы, что null нельзя передать в Mono.justно результат подписки не аннотируется аналогичным образом.

Таким образом, это проблема с Reactor, но, учитывая сложные дженерики, которые могут быть задействованы, ее невозможно реализовать.Вероятно, стоит поднять вопрос с ними, если он не существует.

...