2016-06-09 3 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) 
    } 
} 

Compiler sagt, dass Schwanz() gibt ArraySeq [T], I Array erwartet [T]umwandelnden Ergebnis für Verständnis in scala

BTW Swaps() funktioniert wie erwartet

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

Wie man Array [T] von tail() zurückgibt?

+0

wie wäre es mit 'arr.tail'? – Dima

Antwort

2

Also, das Problem ist, dass es nicht weiß, wie ein Array des unbekannten Typs T erstellen. Arrays sind eine besondere Art von Containern, da sie von systemeigenen Java-Arrays unterstützt werden. Aus diesem Grund muss der Elementtyp beim Instanziieren des Arrays vorhanden sein. Hinzufügen Manifest der Erklärung sollte es beheben:

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

Sie wissen könnten Sie einfach tun arr.tail oder arr.drop(1), nicht wahr? Und swaps könnte arr.grouped(2).flatMap { case Array(a,b) => Array(b,a) case x => x }.toArray

+0

Was bewirkt das Hinzufügen von Manifesten? Warum funktioniert das ?! –

+3

Manifest ist ein Teil der Scala-Reflektionsbibliothek, es enthält einige Informationen über den Typ, z. B. die tatsächliche Laufzeitklasse, auf die es sich bezieht. Wenn Sie es der Klassendeklaration hinzufügen, wird ein impliziter Parameter erstellt, der zur Laufzeit zur Verfügung steht und mit dem das Array des richtigen Typs instanziiert werden kann. Wenn Sie eine konkrete Instanz Ihrer Klasse wie 'Array_8to24 (Array (1,2,3)') erstellen, generiert der Compiler im Grunde eine 'Manifest'-Instanz für' Int' und übergibt sie an die Klasse, also an den Typ Informationen bleiben erhalten und können verwendet werden, wenn 'tail' aufgerufen wird. – Dima

Verwandte Themen