Java 中的选项 T?可能吗?

OptionT in Java? Is it possible?

我对 ScalaZ 提供的 monad 转换器印象深刻,现在我很感兴趣是否可以在 Java 中实现类似 OptionT 的东西?

在 Scala 中,我们可以使用 TypeClasses 来简化实现。 Java中有这样的东西吗?

没有。 OptionT 是一个 higher-kinded 类型构造函数,这意味着它需要一个 类型构造函数(而不是类型)作为参数。 Java 不支持更高种类的类型构造函数,在 Java 中,类型构造函数(又名 generic class / interface)只能接受类型作为参数和 return 类型。

类型构造函数与函数非常相似,除了类型级别。函数(在某些数学分支中也称为 值构造函数 )将值作为参数和 returns 值。如果它接受一个函数作为参数 and/or return 一个函数,那么它被称为 高阶 函数。并不是所有的东西都允许高阶函数,例如C 不支持它们。

类似地,类型构造函数将类型作为参数和 returns 类型(它 "constructs types from types",例如 List 类型构造函数将构造类型 "list of integers",当你将它 Int 作为参数传递)。与函数类似,当类型构造函数可以将类型构造函数作为参数或 returns 类型构造函数时,它被称为 higher-kinded,但并非所有地方都支持它们。特别是,Java 不允许它们。

注意:你可以实际上在Java中说出类似Foo<Foo>的东西,但那是不是 更高类型的构造函数。这里的两个Foo其实是不同的东西:第一个Foo泛型Foo<T>第二个 Foo 原始类型 Foo,它是 Java 5.[=19= 中引入泛型的方式的产物]

是的,这是可能的,但有很多技巧:https://github.com/highj/highj/blob/master/src/main/java/org/highj/data/transformer/MaybeT.java

提到的 https://github.com/highj/highj 库使用普通泛型模拟高阶多态性。因此,您必须手动将高阶表示形式的结果转换回它们的 "normal" 形式。