3 votes

Pourquoi le compilateur de Scala dit que ce type est utilisé dans une position non spécialisable ?

J'ai cette méthode dans package objet :

def extractLoop[@specialized T](x: Map[T, T]) = {
    val whatever = x.head
    val stop = whatever._1
    def iteration(
            acc: Seq[T] = Seq(whatever._1, whatever._2),
            last: T = whatever._2): Seq[T] = {
        val next = x(last)
        if (next == stop) acc
        else iteration(acc :+ next, next)
    }
    iteration()
}

Mais je n'arrive pas encore à comprendre pourquoi le compilateur (j'ai la version 2.9.2) dit type T is unused or used in non-specializable positions. ?

5voto

Régis Jean-Gilles Points 14463

Je crois que la raison en est simplement que vous utilisez un Map[T, T] qui n'est pas spécialisé.

Quelques illustrations :

scala> class MyMap[A,B]
defined class MyMap
scala> def extractLoop[@specialized T](x: MyMap[T, T]) = {
     |   sys.error("TODO")
     | }
<console>:8: warning: type T is unused or used in non-specializable positions.
       def extractLoop[@specialized T](x: MyMap[T, T]) = {
           ^
extractLoop: [T](x: MyMap[T,T])Nothing

Mais si vous vous spécialisez MyMap pour ses deux paramètres de type, vous n'avez pas d'avertissement :

scala> class MyMap[@specialized A,@specialized B]
defined class MyMap
scala> def extractLoop[@specialized T](x: MyMap[T, T]) = {
     |   sys.error("TODO")
     | }
extractLoop: [T](x: MyMap[T,T])Nothing

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X