2011-09-28 6 views
5

Tengo un objeto Java OldFashioned que se extiende Java 1.4 List:Cómo agregar un objeto a la Lista de Java sin parametrizar?

[Java] 
class OldFashioned extends List { ... } 

Es decir, OldFashioned no toma ningún parámetro de tipo. Necesito agregar SomeObject a él. En Java no hay problema, ya que trata List 1.4 como List<Object> 1.5 y permite agregar cualquier subclase de Object a la colección. Pero Scala no. Así que la próxima código no funciona:

[Scala] 
val oldFashioned = new OldFashioned() 
oldFashioned.add(new SomeObject)  // found: SomeObject; required: E 

Es decir, Scala compilador requiere para pasar los parámetros de tipo de OldFashioned que realmente no toma ellos:

[Scala] 
var oldFashioned: OldFashioned[SomeObject] = null // OldFashioned does not take type parameters 

¿Cómo puedo superarlo y agregar SomeObject al OldFashined?

Respuesta

8

Ok, no puedo creer que uno de mis earlier question encuentra un uso aquí (hay que ir answer de agilesteel upvote)

def add(oldFashioned: OldFashioned, any: Any): Boolean = oldFashioned match { 
    case l: java.util.List[a] => l.add(any.asInstanceOf[a]) 
} 

val oldFashioned = new OldFashioned 
// oldFashioned: OldFashioned = [] 

add(oldFashioned, "test") 
// res0: Boolean = true 
add(oldFashioned, 1) 
// res1: Boolean = true 
add(oldFashioned, new Object) 
// res2: Boolean = true 

oldFashioned 
// res3: OldFashioned = [test, 1, [email protected]] 

Editar: Creo que el tiempo que voy a emitir:

oldFashioned.asInstanceOf[java.util.List[SomeObject]].add(new SomeObject) 
+0

Curiosamente, IDEA resalta '[a]' como un error, pero el compilador de Scala no se queja, por lo que funciona. Upvotes para las respuestas de tu y de agilesteel. ¡Gracias! – ffriend

+0

Ya empecé a preguntarme, ¿por qué una de mis respuestas anteriores recibía algunos votos espontáneos repentinamente;) ¡Gracias de vuelta a usted! – agilesteel

Cuestiones relacionadas