Lanzar una colección: Java vs Scala

Siempre estoy apagando mis dedos de los pies contra esto en Java – Tengo una colección de un tipo que quiero echar a una colección de un super-tipo (o interfaz) en lugar de modo que pueda añadir más objetos variados para que .

Java 7:

  público   clase   CollectionCastTest   { 
A {
público Cuerdas hola ();
}

clase B implementos A {
@ Override
público Cadena hola () { volver "Hello World!" ; }
}

público vacío principal ( Cuerdas ... args ) {
< B > ListaB = nueva ArrayList <> ();
ListaB . añadir ( nueva B ());

/ / Java error: incompatible tipos
/ / Lista aList1 = ListaB;

/ / error de Java: Desactivada fundido
/ / Lista
aList2 = (Lista ) ListaB;

List < A > ; aList3 = nueva ArrayList <> ();
aList . addAll ( ListaB );
}
}

Scala

  objeto   CollectionCastTest   { 
A {
def hola : Cuerdas
}

clase B extiende A {
def hola = "Hello World!"
}

def principal ( args : array [ Cuerdas ]) {
val ListaB = List [ B ] ( nueva B ())

/ / Obras
val aList1 : Lista [ A ] = ListaB

/ / Obras
val aList2 : List [ A ] = ListaB partido {
caso l : List [ A ] => l
_ => tirar nueva ClassCastException
}

val aList3 : List [ A ] = List [ A ] () + + ListaB
}
}

Pero no Scala saber que estas listas son los mismos

  scala> val ListaB = List (new B ()) ListaB />  
scala> val aList: Listado [A] = List (new B ()) aList />
scala> aList == ListaB
RES6: Boolean = false

Whoops - no. Pero esto es porque está utilizando la igualdad referencial para B. Vamos a usar el mismo B () en ambas listas y ver qué pasa:

  scala> val b = new B () 
b: B = B @ 4ffe5c31

scala> val ListaB = Lista (b) ListaB />
scala> ; val aList: Listado [A] = lista [A] (b) aList />
scala> aList == ListaB
res0: Boolean = true

El uso de diferentes objetos para B () son posibles también, si hacemos Scala utilizar una prueba de la igualdad basada en los campos del objeto en vez de que es la dirección. Este es el valor predeterminado para las clases de casos, por lo que puede hacer este simple cambio:

  - clase B se extiende A {
+ caso de la clase B se extiende A {

entonces

  scala> val ListaB = List (new B ()) ListaB />  
scala> val aList: Listado [A] = List (new B ()) aList />
scala> aList == ListaB
RES6: Boolean = true

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *