繁体   English   中英

kotlin错误的可空性推论没有任何泛型

[英]kotlin wrong nullability inference without any generics

在春天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

spring方法的java源代码是:

/**
 * 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)

那么为什么编译器仍然需要非可空类型以及如何绕过该要求呢?

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中描述可空性,所以默认情况下传递StringString? 到接受String的Java方法可行。 但是,Kotlin编译器尊重不同版本的可空性注释(例如javax.annotation.* ,Android的注释,Spring的注释),以允许Java代码向Kotlin调用者提供可空性信息。

如何绕过这个? 你不能。 你传递了一个错误类型的参数 - StringString? 在Kotlin是不同的类型。

val url : String? = null val url : String? = null ,那么变量url null ,可以为Nulllable类型的String? 因为它是一个不可变的val 但是我认为我们应该忽略这个问题的可变性。

要“非 ”,可以使用Elvis操作符

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

或者将“默认”值替换为您需要的任何值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM