Tôi nghĩ sẽ dễ dàng hơn khi giải thích nó bằng một ví dụ đơn giản. (giúp rephrasing tiêu đề được chào đón ;-)Scala: Có thể chỉ ra một lớp chung mà thực hiện một phương thức nhất định
Tôi muốn thực hiện phương thức squared
và sử dụng implicit def
, tự động thêm nó vào bất kỳ lớp nào hỗ trợ *
-operator.
Với một Int nó rất dễ dàng:
class EnhancedInt(x: Int) { def squared = x * x }
implicit def IntToEnchancedInt(x: Int) = new EnhancedInt(x)
Nhưng với Bất kỳ hoặc AnyVal tôi nhận được lỗi sau:
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 }
Tôi muốn biết làm thế nào tôi có thể áp dụng nó cho bất kỳ số hoặc thậm chí tốt hơn cho bất kỳ lớp học nào hỗ trợ *
-operator.
+1 câu hỏi hay. Đây là loại thứ Scala mà tôi gặp rắc rối. Trong Haskell, tôi chỉ sử dụng ': t \ x -> x * x' trong ghci (và nó cho tôi biết' Num a => a -> a'), nhưng trong Scala, khi tôi nhập 'x => x * x' trong REPL, nó phàn nàn rằng tôi đã không cho 'x' một kiểu. Và rồi tôi vẫy tay xung quanh và nhắc nhở bản thân rằng hệ thống kiểu của Scala mạnh hơn Haskell. –
Nó có thể hoạt động với Numeric thay vì AnyVal. Bạn nên xem cách Seq.product() quản lý để có được quyền truy cập vào phép nhân. – scand1sk
@DanBurton: Có lẽ bạn đã không giải thích câu hỏi một cách chính xác. Xem câu trả lời của Dan Simon dưới đây. – missingfaktor