2011-07-15 21 views
8

Tengo problemas para comprender el sistema de límites de tipos de scala. Lo que estoy tratando de hacer es hacer una clase titular que contiene elementos de tipo T que puede iterar sobre los elementos de tipo A. Lo que tengo hasta ahora es:Parámetros de tipo de parámetro de Scala

class HasIterable[T <: Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

val hello = new HasIterable("hello") 

La clase en sí se compila correctamente, pero que tratan de crear el valor hello me da este error:

<console>:11: error: inferred type arguments [java.lang.String,Nothing] do 
not conform to class HasIterable's type parameter bounds [T <: Iterable[A],A] 
    val hello = new HasIterable("hello") 
      ^

lo que habría esperado hello para resolver como HasIterable[String, Char] en ese caso. ¿Cómo se resuelve este problema?

Respuesta

17

String en sí no es un subtipo de Iterable[Char], pero es pimp, WrappedString, es. Con el fin de permitir que su definición para hacer uso de las conversiones implícitas, es necesario utilizar un view bound (<%) en lugar de un upper type bound (<:):

class HasIterable[T <% Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

Ahora su ejemplo servirá:

scala> val hello = new HasIterable("hello")    
hello: HasIterable[java.lang.String,Char] = [email protected] 
+1

haría ¿Te importa explicar por qué esto funciona (y el otro no)? – dhg

+0

Esto funcionó para mí, gracias! Y sí, ¿por qué <% funciona en este caso? --aha veo tu edición. Gracias :) – Dylan

+0

@pelotom: gran explicación. ¡Gracias! – dhg

Cuestiones relacionadas