Java中的联合类型
我已经在C#上工作了一段时间,试图更加熟悉Java。因此,我正在尝试迁移我在C#中日常使用的一些基本模式,甚至只是为了理解JVM和dotnet之间的差距并找出如何处理它们。这是我遇到的第一个问题—选项类型—somethiong,在许多语言中都很容易实现,例如Koltlin:Java中的联合类型,java,c#,kotlin,discriminated-union,Java,C#,Kotlin,Discriminated Union,我已经在C#上工作了一段时间,试图更加熟悉Java。因此,我正在尝试迁移我在C#中日常使用的一些基本模式,甚至只是为了理解JVM和dotnet之间的差距并找出如何处理它们。这是我遇到的第一个问题—选项类型—somethiong,在许多语言中都很容易实现,例如Koltlin: sealed class Option<out T : Any> { object None : Option<Nothing>() data class Some<out T
sealed class Option<out T : Any> {
object None : Option<Nothing>()
data class Some<out T : Any>(val value: T) : Option<T>()}
密封类选项{
对象无:选项()
数据类Some(val值:T):Option()}
因此,我可以轻松创建贴图函子:
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))}
fun Option.map(f:(T)->B):选项=
什么时候(这个){
是Option.None->Option.None
是Option.Some->Option.Some(f(this.value))}
这是我可以用Java实现的吗?我不担心扩展方法的缺乏,我可以不考虑,但是如何执行实际的类型匹配而不必依赖未检查的强制转换呢?至少这是IntelliJ所抱怨的…在您提到的具体案例中,以下方法可以奏效:
- (正如@oldcurmudgeon提到的)它也有
- 还有guava库,如果您希望java版本7及以下版本的话,它有。这里相当于
map
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
}
});
UnionType UnionType=new TypeA();
整数计数=unionType.when(新unionType.Cases(){
@凌驾
公共整数为(TypeA TypeA){
//键入特定的处理代码
}
@凌驾
公共整数为(类型B类型B){
//类型B特定处理代码
}
});
样板代码:
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);
}
}
接口类型{
R(c类情况);
接口案例{
R为(A型);
R为(B型);
}
}
类TypeA实现UnionType{
//…键入特定代码。。。
@凌驾
公共R(案例){
返回案例。是(本);
}
}
类TypeB实现UnionType{
//…类型B特定代码。。。
@凌驾
公共R(案例){
返回案例。是(本);
}
}
您正在询问Java,但没有显示Java代码。我觉得这是不对的。C#和Java都没有联合类型,任何变通方法都很难使用。对于一种确实有联合类型的.NET语言,请看F#。看起来可能像是从Java 8中寻找的。没有完全相同的东西-但是为什么你需要一个Java解决方案,而你在Kotlin中已经有了一个可以完美工作的互操作?@OldCurmudgeon,对于Option/Maybe类型,我认为java.util.Optional应该完成这项工作。谢谢你的建议。