2013-07-21 106 views
2

我是新來斯卡拉不同類型的參數...可變參數與斯卡拉

不管怎樣,我想要做的事,如:

val bar = new Foo("a" -> List[Int](1), "b" -> List[String]("2"), ...) 
bar("a") // gives List[Int] containing 1 
bar("b") // gives List[String] containing "2" 

當我這樣做的問題:

class Foo(pairs: (String, List[_])*) { 
    def apply(name: String): List[_] = pairs.toMap(name) 
} 

pairs是Array [(String,List [Any])(或類似的東西)和apply()是錯誤的,因爲List[_]是一種類型,而不是「不同類型」。即使可變參數*返回了一個元組,我仍然不確定如何讓bar("a")返回List[OriginalTypePassedIn]。那麼是否有這樣做的方法?斯卡拉看起來非常靈活,所以感覺應該有一些先進的方式來做到這一點。

+1

這不是一個確切的重複,但相當類似http://stackoverflow.com/questions/17684023/different-types -in-map-scala –

+0

@Rüdiger您在鏈接中的回答非常酷,謝謝。 – eddiemundorapundo

回答

1

這是無法完成的。考慮這個:

val key = readStringFromUser(); 
val value = bar(key); 

value會是什麼類型?這取決於用戶輸入的內容。但是類型是靜態的,它們是在編譯時確定和使用的。

所以你要麼必須使用固定數量的參數,在編譯時就知道它們的類型,要麼在運行時使用泛型變量和類型轉換。

2

這是靜態類型系統只是自然編號:方法有固定的返回類型。它不能依賴於方法參數的值,因爲參數在編譯時是未知的。假設你有bar,它是Foo的一個實例,你不知道它是如何實例化的。您致電bar("a")。您將返回正確類型的實例,但由於該類型直到運行時才確定,因此編譯器無法知道它。

Scala不像,但是,給你一個方便的語法子類型Foo

object bar extends Foo { 
    val a = List[Int](1) 
    val b = List[String]("2") 
}