我已经使用 C# 工作了一段时间,并试图更加熟悉 Java。因此,我试图迁移我在 C# 中日常使用的一些基本模式,甚至只是为了了解 JVM 和 dotnet 之间的差距并弄清楚如何处理它们。这是我遇到的第一个问题 - 一个选项类型 - somethiong 在许多语言中很容易实现,即 Koltlin:
sealed class Option<out T : Any> {
object None : Option<Nothing>()
data class Some<out T : Any>(val value: T) : Option<T>()}
所以我可以很容易地创建一个 map 仿函数:
fun <T : Any, B : Any> Option<T>.map(f: (T) -> B): Option<B> =
when (this) {
is Option.None -> Option.None
is Option.Some -> Option.Some(f(this.value))}
这是我可以用 Java 实现的吗?我不担心缺少扩展方法,我可以没有它,但是如何在不必依赖未经检查的转换的情况下执行实际的类型匹配?至少这就是 IntelliJ 所提示的......
最佳答案
在您提到的特定情况下,以下方法可行:
- (如@oldcurmudgeon 所述)
java.util.Optional
它还有amap
function . - 还有 guava 库,它有
com.google.common.base.Optional
,以防你想要它用于 Java 7 及以下版本。此处与map
等效的是 thetransform
function .
Java 没有模式匹配。在 Java 中最接近模式匹配的是 the visitor pattern。 .
用法:
UnionType unionType = new TypeA();
Integer count = unionType.when(new UnionType.Cases<Integer>() {
@Override
public Integer is(TypeA typeA) {
// TypeA-specific handling code
}
@Override
public Integer is(TypeB typeB) {
// TypeB-specific handling code
}
});
样板代码:
interface UnionType {
<R> R when(Cases<R> c);
interface Cases<R> {
R is(TypeA typeA);
R is(TypeB typeB);
}
}
class TypeA implements UnionType {
// ... TypeA-specific code ...
@Override
public <R> R when(Cases<R> cases) {
return cases.is(this);
}
}
class TypeB implements UnionType {
// ... TypeB-specific code ...
@Override
public <R> R when(Cases<R> cases) {
return cases.is(this);
}
}
关于java - Java 中的联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49491593/