Scala:从 mixin 类型别名继承时为 "class type required but {trait} with {trait} found"

标签 scala inheritance mixins

我定义了一个非常常见的类型别名:

package object policy {

  type KeyGen[K] = Function0[K] with Serializable
}

但是当我尝试继承它时:

import java.security.Key
case class FixedKeyGen(key: Key) extends KeyGen[Key] {

  override def apply(): Key = key
}

maven 编译器给了我以下错误:

[ERROR] /home/peng/git/datapassport/core/src/main/scala/com/schedule1/datapassport/policy/ValueMapping.scala:16: class type required but () => java.security.Key with Serializable found
[ERROR] case class FixedKeyGen(key: Key) extends KeyGen[Key] {
[ERROR]                                          ^
[ERROR] /home/peng/git/datapassport/core/src/main/scala/com/schedule1/datapassport/policy/ValueMapping.scala:16: com.schedule1.datapassport.policy.KeyGen[java.security.Key] does not have a constructor
[ERROR] case class FixedKeyGen(key: Key) extends KeyGen[Key] {

这是怎么回事?

最佳答案

我不认为你可以像那样直接扩展复合类型。也就是说,Function0[K] with Serializable 本身并不是类类型。它是一个没有构造函数的复合类型,这就是关键。在没有构造函数的情况下扩展某些东西真的没有意义。类型别名的作用与此类似(注意类型周围的括号):

case class FixedKeyGen(key: Key) extends (Function0[Key] with Serializable) {
    override def apply(): Key = key
}

我们得到同样的错误:

<console>:20: error: class type required but () => java.security.Key with Serializable found
       case class FixedKeyGen(key: Key) extends (Function0[Key] with Serializable) {

这是因为 Function0[Key] with Serializable 不是类类型。

但是,如果我删除括号,这当然有效。没有它们,FixedKeyGen 将扩展 Function0 并混合 Serializable。有了它们,它正在尝试扩展复合类型。

要解决这个问题,您可能只想使用一个特征,而不是:

trait KeyGen[K] extends Function0[K] with Serializable

case class FixedKeyGen(key: Key) extends KeyGen[Key] {
    override def apply(): Key = key
}

关于Scala:从 mixin 类型别名继承时为 "class type required but {trait} with {trait} found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29082432/

相关文章:

scala - 在 Scala 中创建元素差异为 1 的序列组?

java - Scala - 覆盖特征中的类方法

css - @include makeColumn() Bootstrap Mixin 不工作

scala - 完成部分功能

scala - Play Framework 中指定的基础 docker 镜像在哪里?

scala - 对 Spark 数据框/Hive 结果集进行排序

java - Java中的单例和继承

java - “this”关键字没有访问它应该访问的预期变量。为什么?

c# - 是否可以强制 CaSTLe DynamicProxy 生成的代理将成员实现为显式接口(interface)实现?

css - 无法更改 svg 颜色、填充和描边