Est-il possible de forcer la boxe d'exécution dans Scala dynamiquement? Je voudrais une fonction:Boxing universel/générique de Any à AnyRef
def box(value :Any) :AnyRef
ou
def box[T](value :T) :AnyRef
J'ai une classe générique qui peut être paramétrés avec AnyVals mais il faut les passer à des méthodes Java existants qui acceptent des collections d'objets. Bien sûr, je pourrais l'implémenter moi-même avec la correspondance de modèle, mais c'est un peu ennuyeux d'avoir à le faire encore et encore, et cela ne fonctionnerait pas pour les classes de valeur utilisateur.
Modifier
La réponse est avéré aussi simple que surprenante. Maintenant, puis-je le faire par réflexion? Supposons
class Box[T :TypeTag](private var value :T) {
def get :T = value
def set(o :Any) {
...
}
}
Je voudrais faire un ensemble sûr, la vérification du moteur d'exécution si o est une sous-classe de T comme ceci:
runtimeMirror(getClass.getClassLoader).classSymbol(o.getClass).toType <:< typeOf[T]
Malheureusement, typeof [T] pour Box [Long] sera être une primitive, et la vérification suivante échouera sur java.lang.Long, qui est le type d'éléments d'exécution de Seq [Long] par exemple. Bottom line, lors de l'utilisation de génériques avec AnyVals, le compilateur les encadre parfois rendant les contrôles de classe d'exécution imprévisibles.
Votre partie ajoutée ne semble pas concerner la boxe de 'Any' à' AnyRef'. (On dirait que cela a plus à voir avec le déballage?) Que diriez-vous d'en faire une deuxième question séparée? –