Czy możliwe jest dynamiczne wymuszenie boksowania runtime w scala? Chciałbym funkcję:Uniwersalny/ogólny boks od Any do AnyRef
def box(value :Any) :AnyRef
lub
def box[T](value :T) :AnyRef
mam rodzajowe klasy, które mogą być programowane z AnyVals ale trzeba przekazać je do metod dziedzictwem java akceptujących zbiory przedmiotów. Oczywiście sam mógłbym to zaimplementować za pomocą dopasowywania wzorców, ale trochę denerwujące jest to, że muszę to robić raz po raz, i nie działałoby to dla klas wartości użytkownika.
Edit
Odpowiedź okazała się tak prosta, jak zaskakujące. Czy mogę to zrobić poprzez odbicie? Zakładamy
class Box[T :TypeTag](private var value :T) {
def get :T = value
def set(o :Any) {
...
}
}
Chciałbym zrobić bezpieczny zestaw, sprawdzając w czasie wykonywania, jeśli o to podklasą T tak:
runtimeMirror(getClass.getClassLoader).classSymbol(o.getClass).toType <:< typeOf[T]
Niestety typeof [T] na polu [Long] będzie be prymitywny, a następujące sprawdzanie nie powiedzie się na java.lang.Long, który jest typem środowiska wykonawczego elementów Seq [Long] na przykład. Podsumowując, podczas używania generycznych z AnyValami, kompilator czasami je zapakowuje, sprawiając, że sprawdzenie klasy runtime będzie nieprzewidywalne.
Twoja dodana część nie wygląda na boks z "Any" na "AnyRef". (Wygląda na to, że ma to coś wspólnego z rozpakowywaniem?) Co z tym, że jest to drugie, osobne pytanie? –