gpt4 book ai didi

scala - 是否可以在 Scala 中编写返回具有不同类型参数的对象的方法?

转载 作者:行者123 更新时间:2023-12-01 09:04:13 24 4
gpt4 key购买 nike

是否可以在 Scala 中编写一个方法来返回具有不同类型参数的类型参数化类的对象?像这样的:

class A[T]

def f(switch: Boolean): A = if(switch) new A[Int] else new A[String]

请注意:上面的代码是虚构的,以显示问题的类型;上面的代码在语义上没有意义。

上面的代码不会编译,因为返回类型 A 没有被参数化。

最佳答案

您可以,甚至可以借助封装配对的隐式参数实现类型安全:

class TypeMapping[+A,B] {
def newListB = List.empty[B]
}
trait Logical
object True extends Logical
object False extends Logical

implicit val mapFalseToInt = new TypeMapping[False.type,Int]
implicit val mapTrueToString = new TypeMapping[True.type,String]

def f[A <: Logical,B](switch: A)(implicit tmap: TypeMapping[A,B]) = tmap.newListB

scala> f(True)
res2: List[String] = List()

scala> f(False)
res3: List[Int] = List()

您必须将 bool 值显式映射到自定义 TrueFalse 值。

(我选择 List 作为目标类只是作为示例;您可以选择任何内容,甚至可以通过更多工作使其通用。)

(编辑:正如 oxbow_lakes 指出的那样,如果您需要在同一代码路径上表示所有可能的返回值,那么仅此一项是行不通的,因为 List[Int] 的父类(super class)> 和 List[String]List[Any],这没有多大帮助。在这种情况下,您应该使用 Either。我的解决方案是针对仅在 TrueFalse 上下文中使用的单个函数,并且可以在那里维护类型信息。)

关于scala - 是否可以在 Scala 中编写返回具有不同类型参数的对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11192268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com