6

In Scala 2.11.2, il seguente esempio minimo compila solo quando si utilizza tipo attribuzione sul Array[String]:Scala inferenza di tipo: non può dedurre IndexedSeq [T] da Array [T]

object Foo {  

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

} 

class Foo(source: IndexedSeq[String])  

Se rimuovo il tipo di attribuzione in fromList, si sarà in grado di compilare con il seguente errore:

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

Perché non è possibile che il compilatore dedurre la Array[String] qui? O questo problema deve fare qualcosa con la conversione implicita da Array a IndexedSeq?

+1

Nota Penso che si possa fare: 'oggetto Foo {def listaDa (elenco: Lista [String]): Foo = new Foo (list.toArray [String])} 'invece. – david

+0

O semplicemente 'list.toIndexedSeq', ovviamente. La domanda è comunque buona, comunque. –

+0

Grazie per averlo indicato. La ragione per cui sto andando per 'Array's invece di' IndexedSeq's è puramente per motivi di prestazioni. Ho dovuto profilare la funzione e ho scoperto che 'Vector's richiede più overhead durante la creazione di molte piccole istanze. – Chris

risposta

4

Il problema è che il metodo .toArray restituisce una matrice di qualche tipo B che è una superclasse della T in List[T]. Ciò consente di utilizzare List[Bar] su List[Bar] in uno list.toArray se è necessario Bar .

Sì, il vero motivo per cui questo non funziona immediatamente è che il compilatore sta cercando di capire quale B utilizzare e come arrivare a un IndexedSeq. Sembra che stia cercando di risolvere il requisito IndexedSeq[String] ma è garantito che lo B sia un String o una superclasse di String; da qui l'errore

Questo è il mio lavoro preferito in giro:

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