2011-09-28 17 views
5

Mam obiektu Java OldFashioned który rozciąga Java 1.4 List:Jak dodać obiekt do niezanalizowanej listy Java?

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

Oznacza to, OldFashioned nie bierze żadnych parametrów typu. Muszę dodać do niego SomeObject. W Javie nie ma problemu, ponieważ traktuje on jako obiekt List 1.4 jako List<Object> 1.5 i pozwala na dodanie do kolekcji dowolnej podklasy Object. Ale Scala tego nie robi. Więc następny kod nie działa:

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

Oznacza to, Scala kompilator wymaga przekazać parametry typu do OldFashioned że faktycznie nie bierze je:

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

Jak mogę go pokonać i dodać SomeObject do OldFashined?

Odpowiedz

8

Ok, ja nie mogę uwierzyć, że jedna z moich earlier question znajdzie wykorzystanie tutaj (należy udać upvote agilesteel za answer)

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]] 

Edycja: Myślę, że tak długo, jak mam zamiar rzucić:

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

Zabawnie, IDEA podkreśla "[a]" jako błąd, ale kompilator Scala nie skarży się, więc działa. Rozgrywki dla odpowiedzi zarówno twoich, jak i agilesteela. Dzięki! – ffriend

+0

Już zacząłem się zastanawiać, dlaczego jedną z moich starych odpowiedzi było nagle kilka niespodzianek;) Dziękuję wam! – agilesteel