Scala 指定较弱的Aux类型绑定不会导致编译错误

Scala 指定较弱的Aux类型绑定不会导致编译错误,scala,type-safety,scala-3,aux-pattern,Scala,Type Safety,Scala 3,Aux Pattern,以下是一个例子: sealed trait Type object Type { case object Type1 extends Type case object Type2 extends Type } sealed trait TypedTrait { type Tpe <: Type } object TypedTrait { type Aux[T <: Type] = TypedTrait{ type Tpe = T } } seal

以下是一个例子:

sealed trait Type
object Type {
    case object Type1 extends Type
    case object Type2 extends Type
}

sealed trait TypedTrait {
    type Tpe <: Type
}

object TypedTrait {
    type Aux[T <: Type] = TypedTrait{ type Tpe = T }
}

sealed trait Test {
    //Bounded with TypedTrait.Aux[Type.Type1.type]
    type TptTrait <: TypedTrait.Aux[Type.Type1.type]
}

object Test {
    //No TypedTrait.Aux[Type.Type1.type] type bound
    type Aux[T <: TypedTrait] = Test { type TptTrait = T } //compiles fine, but I expected error
}
密封特征类型
对象类型{
案例对象类型1扩展类型
案例对象类型2扩展类型
}
密封特征类型{

类型Tpe编译时,不能用错误类型实例化此类型:

class Wololo extends TypedTrait { type Tpe = Type.Type2.type } // bad type
val ax: Test.Aux[Wololo] = new Test { type TptTrait = Wololo }
这与

cmd1.sc:24: incompatible type in overriding
type TptTrait <: ammonite.$sess.cmd1.TypedTrait.Aux[ammonite.$sess.cmd1.Type.Type1.type] (defined in trait Test);
 found   : ammonite.$sess.cmd1.Wololo
 required:  <: ammonite.$sess.cmd1.TypedTrait.Aux[ammonite.$sess.cmd1.Type.Type1.type]
    (which expands to)   <: ammonite.$sess.cmd1.TypedTrait{type Tpe = ammonite.$sess.cmd1.Type.Type1.type}
val ax: Test.Aux[Wololo] = new Test { type TptTrait = Wololo }
                                           ^
Compilation Failed
成功

ax: Test.Aux[Wololo] = ammonite.$sess.cmd1$$anon$1@78de58ea
因此,我们可以得出结论,这里的边界结合在一起,但在您实际尝试创建一个违反约束的实例之前不会失败。这可能不会触发任何spec会让它立即失败的情况(毕竟您可以创建一个有效的实例!),因此检查/证明将推迟到您尝试创建实际实例时进行

(由于
密封特性
s,我将其作为一个整体在菊石中进行评估)

@{
封闭性状型
对象类型{
案例对象类型1扩展类型
案例对象类型2扩展类型
}
密封特征类型{
Tpe型
ax: Test.Aux[Wololo] = ammonite.$sess.cmd1$$anon$1@78de58ea
@ {
  sealed trait Type
  object Type {
      case object Type1 extends Type
      case object Type2 extends Type
  }

  sealed trait TypedTrait {
      type Tpe <: Type
  }

  object TypedTrait {
      type Aux[T <: Type] = TypedTrait{ type Tpe = T }
  }

  sealed trait Test {
      //Bounded with TypedTrait.Aux[Type.Type1.type]
      type TptTrait <: TypedTrait.Aux[Type.Type1.type]
  }

  object Test {
      type Aux[T <: TypedTrait] = Test { type TptTrait = T }
  }
  class Wololo extends TypedTrait { type Tpe = Type.Type1.type }
  val ax: Test.Aux[Wololo] = new Test { type TptTrait = Wololo }
  }
defined trait Type
defined object Type
defined trait TypedTrait
defined object TypedTrait
defined trait Test
defined object Test
defined class Wololo
ax: Test.Aux[Wololo] = ammonite.$sess.cmd1$$anon$1@78de58ea