Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的联合类型_Java_C#_Kotlin_Discriminated Union - Fatal编程技术网

Java中的联合类型

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

我已经在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>()}
密封类选项{
对象无:选项()
数据类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
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
    }
});
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应该完成这项工作。谢谢你的建议。