【发布时间】:2021-12-23 18:14:35
【问题描述】:
我有以下case class:
case class Example[T](
obj: Option[T] | T = None,
)
这让我可以像 Example(myObject) 而不是 Example(Some(myObject)) 那样构建它。
要使用 obj,我需要将其标准化为 Option[T]:
lazy val maybeIn = obj match
case o: Option[T] => o
case o: T => Some(o)
the type test for Option[T] cannot be checked at runtime
我尝试使用 TypeTest,但也收到警告 - 或者我发现的解决方案看起来非常复杂 - 请参阅 https://stackoverflow.com/a/69608091/2750966
有没有更好的方法在 Scala 3 中实现这种模式?
【问题讨论】:
-
Option[T] | T类型没有意义。您想要的实际上是一种在创建Example时从T创建Some[T]的设施方法,而不是在使用它时进行一些统一。请参阅@ziggystar 的以下回答。 -
您无法匹配
Option[T],因为这不是具体类型。如果您认为这是您想要的,您可以尝试Option[_]。T类型是抽象的,所以你也不能匹配/instanceOf ......你可以这样做o =>.... 所以最好重新考虑你的设计选择。 -
如果
T=Option[A]会发生什么?甚至T = Option[Option[B]]? -
@LuisMiguelMejíaSuárez,谢谢你的回答很好地解释了它。您提到“也许联合类型的引入可以打开一种更简单的方式来编码可选参数的可能性?”这个问题正是关于这个 - 联合类型是否有一个很好的模式。那么你有答案了吗?