2011-09-09 18 views
9

¿Hay alguna manera de prohibir que un tipo parametrizado sea parametrizado por un tipo específico?Scala que prohíbe la parametrización de un tipo específico

p. Ej. Supongamos que quiero crear mi propio tipo de Lista [T] especializado en el que no deseo que la Lista [Nada] sea legal, es decir, provoque un error de compilación.

Busco una manera de hacer el siguiente error más fácil de coger (sí, entiendo que esto no es muy funcional o gran Scala):

val x = ListBuffer() 
x += 2 

x tiene tipo ListBuffer [Nada].

Respuesta

10

Este tipo de obras,

class C[A](x: A*)(implicit ev: A =:= A) { } 

Habrá un error de tipo si A = Nothing se infiere,

val c1 = new C[Int]() // Ok 
val c2 = new C(1)  // Ok, type `A = Int` inferred 
val c3 = new C()  // Type error, found (Nothing =:= Nothing) required: (A =:= A) 

pero aún así es posible establecer explícitamente el parámetro de tipo A a Nothing,

val c4 = new C[Nothing]() // Ok 

Más en general, es pr etty es complicado para asegurar que dos tipos sean desiguales en Scala. Vea las preguntas anteriores here y here. Un enfoque es establecer una situación en la que los tipos iguales conduzcan a implícitas ambiguas.

+3

Me pregunto si algo así debería ser predeterminado para las colecciones mutables ... para que menos personas puedan olvidar el tipo, pero todavía no tengan nada disponible si es necesario. – soc

2

Puede definir un tipo A>: Null si específicamente desea evitar Nothing, ya que Null es el segundo desde abajo y también covariante a todos los tipos (por lo tanto, su contravariancia incluye todos los tipos excepto Nothing).

No estoy seguro de cuán útil es esto, ya que su tipo de límites aún incluye nulo.

Cuestiones relacionadas