scala - 在 Scala 3 中区分联合类型和类型参数
问题描述
在 Scala 3 中,给定这样一个类型别名:
type Test[A] = A | Option[A]
val first: Test[String] = "gandalf"
val second: Test[String] = None
val third: Test[String] = Some("sam")
我如何区分我有两种情况中的哪一种(A
或Option[A]
)?
在尝试编写代码时,我认为主要问题在于编译器和类型,包括Either[String, B], matches
A`。我什至不知道我的问题是否有惯用的解决方案。
这是我最好的尝试,任何一个都失败了:
def get[A](input: Test[A]): A =
input match
case Some(value) => value.asInstanceOf[A]
case None => throw new RuntimeException("Error!")
case _ => input.asInstanceOf[A]
get(first) // "gandalf"
get(second) // Exception!!!
get(third) // sam"
如您所见value
,不识别为与类型参数相同的类型,A
并且A
在运行时无法真正检查底部的情况(尝试case a: A =>
给出编译错误),因此我通过排除其他两个来捕获它。这看起来不是最佳解决方案。
解决方案
推荐阅读
- c++ - 花哨的技巧可以在本地破坏反射,但不能在在线编译器中破坏
- jquery - JQuery默认情况延迟淡出,当mouseenter保持可见时,mouseout淡出后
- reactjs - 为什么我的状态没有使用反应钩子更新并使用效果
- elasticsearch - 无法通过 python REST API 在 Elasticsearch 中存储二进制文件
- python - 从 API 解析数据 - 获取所有数据的最佳方式?
- python - 从字符串中删除和读取字符
- c++ - 按回车键导出键盘挂钩消息
- javascript - php中错误输入警报后如何避免页面刷新
- vim - 仅在特定行上突出显示关键字
- javascript - 我的网站上没有加载 JQuery 脚本