在scala功能中使用动态返回类型

时间:2017-02-14 22:51:29

标签: scala

我有一个函数,它获取一个名为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)
}

谢谢!

2 个答案:

答案 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] = ...

但我再次认为如果最终目标得到解释会更容易回答