неправильный вывод об исключении - PullRequest
0 голосов
/ 24 декабря 2018

весной mvc (5.1.3) я пытаюсь сделать:

val url : String? = null
val matcher: ResultMatcher = MockMvcResultMatchers.forwardedUrl(url)

и я получаю ошибку компиляции для второй строки.

из intellij (kotlinc-jvm 1.3.11):

Error:(230, 56) Kotlin: Null can not be a value of a non-null type String

или из Gradle (kotlin 1.2.71):

 Type mismatch: inferred type is String? but String was expected

Исходный код Java метода Spring:

/**
 * Asserts the request was forwarded to the given URL.
 * <p>This method accepts only exact matches.
 * @param expectedUrl the exact URL expected
 */
public static ResultMatcher forwardedUrl(String expectedUrl) {
    return result -> assertEquals("Forwarded URL", expectedUrl, result.getResponse().getForwardedUrl());
}

intellij отображает javadoc:

org.springframework.test.web.servlet.result.MockMvcResultMatchers @NotNull 
@Contract(pure = true) 
public static org.springframework.test.web.servlet.ResultMatcher forwardedUrl(@Nullable String expectedUrl)

, так почему компилятору по-прежнему требуется тип, который не может иметь значение NULL, и как обойти это требование?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

val url : String? = null, тогда переменная url равна null с типом nullable String?, поскольку она является неизменяемой val.Однако я думаю, что мы должны игнорировать изменчивость в этом вопросе.

Чтобы «обнулить» его, можно использовать оператор Элвиса :

val matcher: ResultMatcher = MockMvcResultMatchers.forwardedUrl(url ?: "")

Или заменить "значение по умолчанию во все, что вам нужно.

0 голосов
/ 24 декабря 2018

Нет явных аннотаций обнуляемости для параметра MockMvcResultMatchers.forwardedUrl, поэтому по умолчанию он будет @NonNullApi, как указано в package-info.java:

/**
 * Contains built-in {@code ResultMatcher} and {@code ResultHandler} implementations.
 * <p>Use {@link org.springframework.test.web.servlet.result.MockMvcResultMatchers}
 * and {@link org.springframework.test.web.servlet.result.MockMvcResultHandlers}
 * to access instances of those implementations.
 */
@NonNullApi
@NonNullFields
package org.springframework.test.web.servlet.result;

import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;

Естьнет способа описать обнуляемость в Java, поэтому по умолчанию передача String и String? в метод Java, который принимает String, будет работать.Однако компилятор Kotlin учитывает различные варианты аннотаций обнуляемости (например, javax.annotation.*, аннотации Android, аннотации Spring), чтобы позволить коду Java предоставлять информацию об обнуляемости вызывающим Kotlin.

Как это обойти?Ты не можешьВы передаете аргумент неправильного типа - String и String? - это разные типы в Kotlin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...