2012-11-12 9 views
6

Sto scrivendo una classe che implementa Scala (involucri) un java.util.List, vale a dire:Delegato java.util.List # toArray (T [] a) in Scala

class MyList(backingList: java.util.List) extends java.util.List 

Quest'ultimo ha un metodo toArray con una firma Java come questo:

<T> T[] toArray(T[] a) 

Ingenuamente, ho scritto questo come:

def toArray[T](a: Array[T]) = backingList toArray a 

ma il compilatore si lamenta che la chiamata alla toArray su Backi ngList si aspetta un Array[? with java.lang.Object].

Penso di aver provato ogni possibile variazione su cose come Array[_ >: T with Object] (che il compilatore suggerisce gentilmente), ma senza fortuna. Eventuali suggerimenti?

+1

Non è una risposta alla tua domanda, ma si sa già esistono tali involucri in 'JavaConversions' /' JavaConverters'? +1 BTW. –

+1

Lo so, ma questo è nel contesto di 'ObservableList' di JavaFX (che estende java.util.List). –

risposta

3

Questo funziona anche:

def toArray[T](a: Array[T with Object]) = backingList.toArray[T](a) 
+0

Effettivamente. 'backingList toArray [T] (a)' (cioè senza il punto) non funziona però, ma probabilmente è una cosa della sintassi di Scala. –

2

Array[_ >: T with Object] è zucchero sintattico per Array[X forSome {type X <: Object}], il che significa un array di oggetti il ​​cui tipo è un sottotipo di oggetto, ma quello che vi serve è un array di oggetti dello stesso tipo X, che è un sottotipo di oggetto. Quindi, in breve, è solo una questione di scoping.

def toarray(a: Array[X] forSome {type X <: Object}) = backingList toArray a 
+0

Non penso che sostituisca il metodo 'List.toArray'. –

+0

Non penso che dovrebbe, almeno la domanda non lo dice. Leggendo di nuovo la domanda, potrebbe essere interpretata in questo modo. : D –

+0

Sì, è necessario implementare 'List.toArray'. –

Problemi correlati