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úblicoCadena 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
Pero no Scala saber que estas listas son los mismos 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: 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: entonces
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 span> [ A ] = ListaB
/ / Obras
val aList2 : List [ A ] = ListaB partido {
caso l : List [ A ] => l
_ => tirar nueva ClassCastException
}
val aList3 : List [ A ] = List [ A ] () + + ListaB
}
}
scala> val ListaB = List (new B ()) ListaB />
scala> val aList: Listado [A] = List (new B ()) aList />
scala> aList == ListaB
RES6: Boolean = false
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
- clase B se extiende A {
+ caso de la clase B se extiende A {
scala> val ListaB = List (new B ()) ListaB />
scala> val aList: Listado [A] = List (new B ()) aList />
scala> aList == ListaB
RES6: Boolean = true