Java 可为空的类型是可选的吗?

Java 可为空的类型是可选的吗?,java,kotlin,jackson,optional,nullable,Java,Kotlin,Jackson,Optional,Nullable,是否可以通过某种方式将可空类型传递给可选类型? 例如: X类( val x:可选 ) 为什么? 我希望通过以下方式序列化此文件: X(Optional.of(1)) -> {"x":1} X(Optional.of(null)) -> {"x":null} // <- throws X(Optional.empty()) -> {} X(可选。of(1))->{“X”:1} X(可选的.of(null))->{“X”:null}/{} 通知 我发现使用双可选选项可以

是否可以通过某种方式将可空类型传递给可选类型? 例如:

X类(
val x:可选
)
为什么? 我希望通过以下方式序列化此文件:

X(Optional.of(1)) -> {"x":1}
X(Optional.of(null)) -> {"x":null} // <- throws
X(Optional.empty()) -> {}
X(可选。of(1))->{“X”:1}
X(可选的.of(null))->{“X”:null}/{}
通知 我发现使用双可选选项可以实现我想要的功能,如下所示:

class X(
    val x: Optional<Optional<String>>
)
X类(
val x:可选
)

但是如果有办法使用Kotlins可空类型或者知道为什么没有,那还是很有意思的。

不建议使用
valx:Optional
,因为根据定义,您无法创建包含
null
值的可选容器,如果您尝试使用
Optional.of创建可选容器,您将遇到NPE(null)
Optional.of(value)
接受不可为空的值()和
Optional.of可为空的值(value)
可以接受可为空的值,但将返回空的
Optional
()

如果您希望能够以下面的方式序列化

X(Optional.of(1)) -> {"x":{"present":true}}
X(null) -> {"x":null}
您可以如下定义该类

class X(
    val x: Optional<Int>?
)
由于默认情况下,Jackson会将其序列化为
{“x”:{“present”:false}
。您必须避免的唯一选项是使用
ObjectMapper
中的
Jackson-datatype-jdk8
依赖项注册
Jdk8Module

val mapper = ObjectMapper()
val jdk8Module = Jdk8Module()
jdk8Module.configureAbsentsAsNulls(true)
mapper.registerModule(jdk8Module)
但这将把一个空的可选变量视为javanull,从而序列化如下

X(Optional.empty()) -> {"x":null}
X(Optional.of(1)) -> {"x":1}
Optional.ofNullable(value)
null
作为
value
的行为类似于
Optional.empty()
,因为两者都将返回空的
Optional


获取
X(Optional.empty())->{}
的唯一方法是用
@JsonInclude(JsonInclude.Include.NON_NULL)
注释字段,但这也意味着您将获得序列化
X(NULL)->{}

Optional.ofNullable
Optional.of(NULL)
将抛出NPEThis
可选?
应该可以。尽管我建议定义一些特殊类来表达这种行为。
val mapper = ObjectMapper()
val jdk8Module = Jdk8Module()
jdk8Module.configureAbsentsAsNulls(true)
mapper.registerModule(jdk8Module)
X(Optional.empty()) -> {"x":null}
X(Optional.of(1)) -> {"x":1}