E 'possibile forzare la boxe di runtime in scala dinamicamente? Vorrei una funzione:Boxe universale/generico da Any a AnyRef
def box(value :Any) :AnyRef
o
def box[T](value :T) :AnyRef
ho una classe generica che può essere parametrizzato con AnyVals, ma ha bisogno di passarli ai metodi eredità java accettare collezioni di oggetti. Naturalmente, potrei implementarlo io stesso con il pattern matching, ma è un po 'fastidioso doverlo fare più e più volte, e non funzionerebbe per le classi di valore utente.
Modifica
La risposta si è rivelata tanto semplice quanto sorprendente. Ora, posso farlo attraverso la riflessione? Assumere
class Box[T :TypeTag](private var value :T) {
def get :T = value
def set(o :Any) {
...
}
}
vorrei fare una serie di sicurezza, il check-nel runtime se o è una sottoclasse di T come questo:
runtimeMirror(getClass.getClassLoader).classSymbol(o.getClass).toType <:< typeOf[T]
Purtroppo, TypeOf [T] per Box [fino a quando] essere un primitivo, e il seguente controllo fallirà su java.lang.Long, che è il tipo di runtime di elementi di Seq [Long] ad esempio. In conclusione, quando si usano i generici con AnyVals, il compilatore a volte li inserisce rendendo i controlli della classe di runtime imprevedibili.
La parte aggiunta non sembra riguardare il boxing da "Qualsiasi" a "AnyRef". (Sembra che abbia più a che fare con l'unboxing?) Che ne dici di renderlo una seconda domanda separata? –