6

In Scala 2.11.2, die folgenden minimalen Beispiel nur kompiliert, wenn Typ Zuschreibung auf dem Array[String] mit:Typinferenz Scala: nicht folgern IndexedSeq [T] von Array [T]

object Foo {  

    def fromList(list: List[String]): Foo = new Foo(list.toArray : Array[String]) 

} 

class Foo(source: IndexedSeq[String])  

Wenn ich entferne den Typ Zuschreibung in fromList, wird es nicht mit dem folgenden Fehler kompilieren:

Error:(48, 56) polymorphic expression cannot be instantiated to expected type; 
found : [B >: String]Array[B] 
required: IndexedSeq[String] 
    def fromList(list: List[String]): Foo = new Foo(list.toArray) 
                ^

Warum kann der Compiler die Array[String] hier schließen? Oder muss dieses Problem etwas mit der impliziten Konvertierung von Array zu IndexedSeqs zu tun haben?

+1

Hinweis Ich glaube, Sie tun können: 'Objekt Foo {def fromList (Liste: Liste [String]): Foo = new Foo (list.toArray [Zeichenfolge])}} stattdessen. – david

+0

Oder einfach 'list.toIndexedSeq', natürlich. Die Frage ist aber immer noch gut. –

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Der Grund, warum ich mich für 'Array' anstelle von' IndexedSeq' interessiere, ist rein aus Leistungsgründen. Ich musste die Funktion profilieren und fand heraus, dass '' '' '' '' '' '' mehr Aufwand beim Erstellen von vielen kleinen Instanzen mit sich bringt. – Chris

Antwort

4

Das Problem ist, dass das Verfahren .toArray ein Array von irgendeiner Art gibt B die eine übergeordnete Klasse der T in List[T] ist. Dies ermöglicht Ihnen die Verwendung eines list.toArray auf List[Bar], wobei Array[Foo] erforderlich ist, wenn Bar erweitert Foo.

Ja, der wahre Grund, dies nicht aus der Box funktioniert ist, dass der Compiler auf ein IndexedSeq die B zu verwenden und auch, wie man herauszufinden versucht. Es scheint, als ob es versucht, die IndexedSeq[String] Anforderung zu lösen, aber B ist nur garantiert eine String oder eine Oberklasse von String; daher der Fehler.

Dies ist meine bevorzugte Arbeit um:

def fromList(list: List[String]): Foo = new Foo(list.toArray[String]) 
Verwandte Themen