我有一个函数,它获取一个名为model的字符串并返回该case类的实例,但我想知道在这个函数中使用动态返回类型的正确方法是什么?
case class Person(fname: String, lname: String)
case class Animal(type: String, weight: Double)
def getInstanceOf(model: String): ??? = model match {
case "person" => Person("jack", "robinson")
case "animal" => Animal("lion", 190.0)
}
谢谢!
答案 0 :(得分:6)
也许您可以定义抽象类并从中扩展两个类,然后您可以将抽象类指定为返回类型:
abstract class Living
case class Person(fname: String, lname: String) extends Living
case class Animal(Type: String, weight: Double) extends Living
def getInstanceOf(model: String): Living = model match {
case "person" => Person("jack", "robinson")
case "animal" => Animal("lion", 190.0)
}
// getInstanceOf: (model: String)Living
答案 1 :(得分:3)
这可能有助于更多地了解最终目标是建议解决方案。
如果您的模型都符合特定的分类,并且您不需要确切知道它们是什么实例,那么上面的abstract class
(或trait
)建议应该有效。
编辑:我的原始答案包括以下代码段:
您还可以使返回类型通用,并在此方案中为其添加类型边界,例如:
def getInstanceOf[T <: Living](model: String): T = ...
但如下所述,这允许调用者指定他们期望的类型,这可能会抵消model
参数中包含的内容
如果您只返回了两种可能的类型中的一种,但需要确切的类型,那么Either[T1, T2]
可能适合http://www.scala-lang.org/api/current/scala/util/Either.html},例如:
def getInstanceOf(model: String): Either[Person, Animal] = ...
但我再次认为如果最终目标得到解释会更容易回答