Mic*_*luk 5 c# java discriminated-union kotlin
我已经使用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>()}
Run Code Online (Sandbox Code Playgroud)
这样我就可以轻松创建地图函子:
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))}
Run Code Online (Sandbox Code Playgroud)
这是我可以用Java实现的吗?我不担心缺少扩展方法,我可以不用它,但是如何执行实际的类型匹配而不必依赖未经检查的类型转换?至少多数民众赞成在IntelliJ抱怨的是...
Eri*_*ric 13
在您提到的特定情况下,以下方法有效:
java.util.Optional它也有一个map功能。com.google.common.base.Optional如果你想要它用于 Java 版本 7 及更低版本。相当于map这里的transform函数。Java 没有模式匹配。在 Java 中最接近模式匹配的是访问者模式。
用法:
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
}
});
Run Code Online (Sandbox Code Playgroud)
样板代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4036 次 |
| 最近记录: |