Je veux trouver un moyen de définir une nouvelle méthode dans une classe existante dans scala.Injecter des méthodes dans des classes existantes
Par exemple, je pense que la méthode asInstanceOf[T]
a trop longtemps un nom, je veux le remplacer par as[T].
Une approche avant droit peut être:
class WrappedAny(val a: Any) {
def as[T] = a.asInstanceOf[T]
}
implicit def wrappingAny(a: Any): WrappedAny = new WrappedAny(a)
Y at-il une manière plus naturelle avec moins de code?
En outre, une chose étrange se produit lorsque je tente ceci:
scala> class A
defined class A
scala> implicit def toA(x: Any): A = x
toA: (x: Any)A
scala> toA(1)
Et la console hang. Il semble que toA(Any)
ne devrait pas passer la phase de vérification de type, et il ne peut pas quand il n'est pas implicite. Et mettre tout le code dans un code source externe peut produire le même problème. Comment est-ce arrivé? Est-ce un bug du compilateur (version 2.8.0)?
Wow! Ceci est incroyable. Comment avez-vous eu cette idée? Et de plus, l'asInstanceOf [T] n'est qu'un exemple. Je suis juste curieux qu'il y ait de la syntaxe pour travailler dans le cas général. –
En règle générale, s'il y a évidemment une erreur de type dans votre code mais que le compilateur l'accepte, il y a une conversion implicite au travail ... ça et le fait qu'il soit suspendu étaient les indices majeurs :) –