java - Java 中的联合类型

标签 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 : 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 所提示的......

最佳答案

在您提到的特定情况下,以下方法可行:

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/

相关文章:

java - 代理实例如何将自身传递给 IncationHandler?

java - 泽西客户端 HTTPS 性能问题

java - XPathExpression动态返回值

java - 使用 Java 将测试结果传递给 Selenium 中的 ITestResult

kotlin - 如何在 Quarkus 中注册 Jackson 模块?

c# - c#中JSON的反序列化

c# - EF 错误地映射 ID 属性

c# - Xamarin 表单 ListView : Deselecting selected item by checking with OnTapped Event

android - 从资源字符串数组创建 ArrayList<String>

java - 字节数组(十六进制)转换为 Int 问题。 ( Kotlin /Java)