2016-06-09 66 views
3
case class Array_8to24[T](val arr:Array[T]) { 
    def tail():Array[T] = { 
    for(i <- 1 until arr.length toArray) yield arr(i) 
    } 
} 

編譯器說,尾()返回ArraySeq [T],我期望陣列[T]轉換在階換理解的類型的結果

BTW互換()如預期工作

def swaps(arr:Array[Int]):Array[Int] = { 
    for(i <- 0 until arr.length toArray) yield {  
     if((i+1)%2 != 0 && i+1<arr.length){ 
     arr(i + 1) 
     }else { 
     arr(if(i==arr.length-1 && arr.length%2!=0) i else i - 1) 
     } 
    } 
    } 

如何從tail()返回Array [T]?

+0

'arr.tail'怎麼樣? – Dima

回答

2

所以,問題是它不知道如何創建一個未知類型的數組T。數組是一種特殊的容器,因爲它們是由本地java數組支持的,因此在數組實例化時需要使用元素類型。添加艙單申報應該修復它:

case class Array_8to24[T : Manifest](val arr:Array[T]) { 
    def tail(): Array[T] = 
    for(i <- 1 until arr.length toArray) yield arr(i) 
} 

你知道你可以只是做arr.tailarr.drop(1),對不對? 和swaps可能是arr.grouped(2).flatMap { case Array(a,b) => Array(b,a) case x => x }.toArray

+0

添加Manifest是做什麼的?爲什麼這個工作?! –

+3

Manifest是scala反射庫的一部分,它載有一些關於類型的信息,例如它所指的實際運行時類。像這樣將它添加到類聲明中會創建一個在運行時可用的隱式參數,並且可以用來實例化正確類型的數組。基本上,當你像'Array_8to24(Array(1,2,3)')那樣創建類的具體實例時,編譯器會爲'Int'生成一個'Manifest'實例並將其傳遞給類,以便類型信息被保存並且可以在每次調用「tail」時使用。 – Dima