2017-02-14 25 views
0

我有一個函數,它獲取一個帶有模型名稱的字符串並返回該case類的一個實例,但是我想知道在這個函數中使用動態返回類型的正確方法是什麼?在Scala功能中使用動態返回類型

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) 
} 

謝謝!

+1

您能想出一個基類爲所有可能的輸出類型,但是您仍然必須轉換爲特定類型才能訪問類型特定的方法。通常,從單一方法返回不相關的類型是個不錯的主意。 – jwvh

+0

在編譯時您無法知道甚至在運行時才存在的信息。類型是編譯時的概念。 –

回答

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

但同樣,我認爲這將是比較容易回答,如果最終目標是解釋有點

+0

'def getInstanceOf [T <:Living](model:String):T = ...'對此不好,因爲它表示調用者根據'model'的值選擇'T'而不是它。 –

+0

@Alexey Romanov,這實際上是一個偉大的觀點。我會更新我的答案來解決這個問題 – MattEdge

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