scala - 特征成员中的高级类型:_$1 没有类型参数,预期:1

scala - Higher kinded type in trait member: _$1 takes no type parameters, expected: 1

当我有以下代码时,我认为有些事情我不太理解:

trait Configuration[F[_]] {
  def get(key: String): F[ConfigValue]
}

class InMemoryConfig extends Configuration[Option] {
  override def get(key: String): Option[ConfigValue] = ???
}

class InFileConfig(path: String) extends Configuration[Try] {
  override def get(key: String): Try[ConfigValue] = ???
}

trait Logging {
  def config: Configuration[_] // does not work
  // ...
}

class DefaultLogging {
  override val config = new InMemoryConfig
  // ...
}

classes 的名称几乎没有意义,general 目标是在特征中拥有一个成员而不定义参数类型,以便 延迟选择直到执行(实际上是在DefaultLoggingclass)。

因为 Logging 不知道哪种类型的构造函数将用于 Configuration 它必须像任何其他类型参数一样继承它。

因此:

trait Logging[F[_]] {
  def config: Configuration[F]
  // ...
}

这同样适用于任何依赖于Logging它需要指定类型或保持依赖性的东西。
因此,一个常见的观察是是否需要这种直接依赖,但这成为设计问题,有时是个人偏好问题。