scala - 值不是类型参数的成员
问题描述
我试图在隐式实现方法中调用方法bark
,Dog
但是我得到了
def speak[Dog](dog: Dog): String = dog.bark ^ 第 16 行:错误:值 bark 不是类型参数 Dog 的成员
这是我的代码
// Define class/type
case class Dog(val breed: String) {
val bark: String = s"Bark!! I am a $breed"
}
// Define interface
trait Speakable[A] {
def speak[A](animal: A): String
}
// Define interface companion object, where we can provide
// implicit implementation methods
object Speakable {
def speak[A](animal: A)(implicit sp: Speakable[A]) = sp.speak(animal)
implicit val dogSpeak: Speakable[Dog] = new Speakable[Dog] {
def speak[Dog](dog: Dog): String = dog.bark
}
}
提前致谢
解决方案
您的类型类不需要额外的类型参数A
trait Speakable[A] {
def speak(animal: A): String
}
(当您定义A
方法的此类类型参数时,它隐藏了A
特征的类型参数)。
然后实例
implicit val dogSpeak: Speakable[Dog] = new Speakable[Dog] {
def speak(dog: Dog): String = dog.bark
}
也不需要方法的类型参数(当您定义Dog
了没有使用类的此类类型参数时Dog
,您定义了隐藏类的新类型)。
推荐阅读
- android - RecyclerView onCreateViewHolder() 性能
- r - 在 R 中转换货币
- laravel - 根据一列和给定值的日期差异在 2 个表上进行雄辩的检索
- azure - 使用 nlog.config 在 Azure 函数日志流中进行 NLog
- c# - webview 使用 HTTPS
- c++ - 为什么我无法处理从外部析构函数抛出的异常?
- c# - .NET Forms 身份验证 - 保护具有混合内容的旧站点
- laravel - 使用 Vue js 在 Laravel Blade 中动态添加行
- alfresco - 为什么在 .parallel() 期间出现 MyBatisSystemException。在 Alfresco 6.2 中执行?
- python - 如何通过 nginx 在 Django 中提供生成的文件作为下载?