Je démarre sur une application Scala qui utilise Hibernate (JPA) à l'arrière. Pour charger un objet, j'utilise cette ligne de code:Fonction de chargement d'objet générique pour scala
val addr = s.load(classOf[Address], addr_id).asInstanceOf[Address];
Inutile de dire, c'est un peu douloureux. J'ai écrit une classe d'aide qui ressemble à ceci:
import org.hibernate.Session
class DataLoader(s: Session) {
def loadAddress(id: Long): Address = {
return s.load(classOf[Address], id).asInstanceOf[Address];
}
...
}
Alors, maintenant, je peux le faire:
val dl = new DataLoader(s)
val addr = dl loadAddress(addr_id)
Voici la question: Comment puis-je écrire une méthode paramétrisé générique qui peut charger tout objet en utilisant ce même modèle? i.e.
val addr = dl load[Address](addr_id)
(ou quelque chose dans ce sens.)
Je suis nouveau à Scala donc s'il vous plaît pardonnez ici c'est particulièrement hideux.
@Daniel - votre distribution asInstanceOf n'est pas vraiment sûre J'ai peur. Considérons le cas de deux instructions 'val a = load [Adresse] (1)' et 'val b: Any = load [Adresse] (2)'. Dans le second cas, aucun cast de la classe 'Address' n'est en cours (ils sont effacés) et vous faites confiance à Hibernate pour vous renvoyer une instance du bon type (ce qui, pour être juste, le fera certainement). –
@oxbow je vois. Votre argument étant qu'un 'Class.cast' provoquera une erreur d'exécution dans le' load', au lieu d'être laissé avec quelque chose qui pourrait causer des problèmes plus tard? –
Oui - c'est exactement ça. Le seul "correct" cast en cours ici est en dehors de la méthode 'load' et inséré par le compilateur car le type de la référence' a' est Address. Si la méthode 'load' est appelée et assignée à un' Any', alors aucun CCE ne se produit et vous pouvez trouver que quelque chose se casse en bas de la ligne. –