【问题标题】:Unexpected non-null type in pure Java API纯 Java API 中的意外非空类型
【发布时间】:2020-05-21 00:14:42
【问题描述】:

Gradle 在其 API 中提供以下类:https://docs.gradle.org/5.6.4/javadoc/org/gradle/api/tasks/ScalaRuntime.html

这个类有一个简单的构造函数,它接受一个Project 实例。但是,在我的情况下,我手头没有Project,但我仍然想使用这个类的其他方法,这些方法并不真正依赖于这个值,所以我决定将null 值传递给构造函数:

val scalaRuntime = ScalaRuntime(null)

但是,编译器失败并出现以下错误:

Null can not be a value of a non-null type Project

我不确定这里会发生什么,因为显然这是一个 Java 类,而不是 Kotlin,并且没有可空性注释。 Kotlin 怎么会拒绝这个代码?我假设它需要 Project! 类型的值(即平台类型),而不是不可为空的类型。

现在解决这个问题的唯一方法是使用反射来调用这个构造函数,这自然可以很好地工作,所以这个构造函数并不需要一个真正的不可为空的参数。

我在这里缺少什么?为什么 Kotlin 假定构造函数参数是非空的?

【问题讨论】:

  • 我猜这里,但有些方法用@Nullable 注释,所以 Kotlin 很可能得出结论,任何没有注释的方法都是不可为空的。
  • @Andreas 这就是我在“没有可空性注释”下的真正意思——确实没有:github.com/gradle/gradle/blob/v5.6.4/subprojects/scala/src/main/…
  • @Andreas 不,这是包装上的注释。

标签: java gradle kotlin types nullable


【解决方案1】:

org.gradle.api.tasksis annotated with @org.gradle.api.NonNullApi:

将一个类型或整个包标记为默认提供非空 API。除非特别标记为 Nullable,否则所有参数和返回类型都假定为 Nonnull。所有类型的注解包都继承包规则。子包不继承可空性规则,必须注解。

【讨论】:

  • 直到你可以注释包o_O 非常感谢你,这确实回答了这个问题。只是为了确保 - 我是否正确理解在 Kotlin 中没有反射就无法使用 null 参数调用此方法?
  • 不,没有。但是您可以添加一个简单的 Java 包装器来调用它,然后从 Kotlin 中调用该包装器。
  • 是的,Java 包装器是我想到的第二件事。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2016-06-02
  • 2015-02-15
  • 2017-06-14
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2011-01-28
相关资源
最近更新 更多