Myślę, że łatwiej jest wyjaśnić to na prostym przykładzie. (Pomoc przeformułowanie tytuł jest mile widziane ;-)Scala: Czy można wskazać klasę ogólną, która implementuje określoną metodę?
Chciałbym zaimplementować metodę squared
i korzystając implicit def
automatycznie dodać go do dowolnej klasy, który obsługuje *
-operator.
Z Int to bardzo proste:
class EnhancedInt(x: Int) { def squared = x * x }
implicit def IntToEnchancedInt(x: Int) = new EnhancedInt(x)
Ale z żadną lub AnyVal pojawia się następujący błąd:
scala> class EnhanceAny(x: AnyVal) { def squared = x * x }
<console>:7: error: value * is not a member of AnyVal
class EnhanceAny(x: AnyVal) { def squared = x * x }
Chciałbym wiedzieć, w jaki sposób mogę zastosować go do dowolnego numeryczny klasa, a nawet lepiej, do każdej klasy obsługującej operatora-*
.
+1 dobre pytanie. Jest to rodzaj rzeczy z Scali, z którymi mam problem. W Haskell, po prostu użyłbym ': t \ x -> x * x' w ghci (i mówi mi" Num a => a -> a "), ale w Scali, kiedy wpisuję' x => x * x' w REPL, narzeka, że nie podałem 'x' typu. A potem macham rękami i przypominam sobie, że system typu Scala jest bardziej "potężny" niż Haskella. –
Może współpracować z Numeric zamiast AnyVal. Powinieneś zobaczyć, jak Seq.product() zarządza, aby uzyskać dostęp do mnożenia. – scand1sk
@DanBurton: Być może nie poprawnie odczytałeś pytania. Zobacz odpowiedź Dana Simona poniżej. – missingfaktor