2012-07-23 59 views
1

我想要寫Scala中的一個類,它的字節或布爾值的這樣一個重複參數

class Bytes(data: Byte*) { 
    def this(data: Boolean*) = this { 
    val res: Array[Byte] = convBools2Bytes(data) 

    res: _* 
    } 

    // […] 
} 

任意數,其中convBools2Bytes是一種轉換Array[Boolean]Array[Byte]的函數:

def convBools2Bytes(data: Array[Boolean]): Array[Byte] 

這給了我以下編譯器錯誤:

[error] Bytes.scala:5: no `: _*' annotation allowed here 
[error] (such annotations are only allowed in arguments to *-parameters) 
[error]  res: _* 
[error]  ^

據我所知,res: _*語句將Array[Byte]變成一個重複參數列表(如在「Programming in Scala」, 2nd Ed.的第8.8節中所述)。

爲什麼會出現這樣的錯誤,我該如何避免它?

+0

我剛剛插入'convBools2Bytes'來表達清楚。沒想過。在真正的實現中,這個塊中有很多代碼。所以在這個例子中,它確實沒有任何意義。 – pvorb 2012-07-23 20:55:07

回答

6

正如編譯器所說,你可能只能在vararg參數的參數中使用它。您試圖讓該塊返回一個擴展的可變參數列表,這是不允許的。 如果你想使用,然後塊:

this({ 
    val res: Array[Byte] = convBools2Bytes(data) 
    res 
}: _*) 

否則這應該是罰款以及

this(convBools2Bytes(data): _*) 

但你會碰到另一個問題,擦除會導致二者具有相同的簽名並防止編譯。 我認爲你會過得更好,不會超載反正

+0

我以爲數組是特例,不會被擦除 – 2012-07-23 20:51:57

+0

通常是的,但採取可變參數的方法會被編譯爲採用scala.collection.Seq的方法。 – Kaito 2012-07-23 20:55:09

+0

謝謝,凱託。你對最後一個陳述是正確的:現在我得到了一個「雙重定義」的錯誤。有沒有辦法避開它? – pvorb 2012-07-23 21:02:29