Scala 上类型边界隐式?

Scala Upper type bounds implicitly?

我有一个像这样的第一个 trait :

trait FirstTrait[U] {
  val myVal: U
}

还有一个如下:

trait SecondTrait[T <: firstTrait[U],U]

对于我正在做的实现:

case class FirstImpl(myVal: MyType) extends FirstTrait[MyType]

object SecondImpl extends SecondTrait[FirstImpl,MyType]

有没有更好的方法来做同样的事情,如果可能的话,我想像这样简化我对第二个特征的实现:

object SecondImpl extends SecondTrait[FirstImpl]

编辑

我在输入函数后使用:

  def func[T <: FirstTrait[U],U](myVal: T): U

当我使用存在类型时,我必须明确类型,否则我会收到 "inferred type arguments [FirstImpl,Nothing] do not conform to method func" 错误。

所以这就是我必须实现该功能的方式:

val myVal : MyType = MyType()
func[FirstImpl,MyType](FirstImpl(myVal))

有什么可以简化的吗?

你可以试试存在型

trait FirstTrait[U] {
  type _U = U
  val myVal: U
}

trait SecondTrait[T <: FirstTrait[_]]

case class FirstImpl(myVal: MyType) extends FirstTrait[MyType]

object SecondImpl extends SecondTrait[FirstImpl]

def func[T <: FirstTrait[_]](myVal: T): myVal._U = ???

func(FirstImpl(myVal)): MyType

trait FirstTrait {
  type U
  val myVal: U
}

trait SecondTrait[T <: FirstTrait]

case class FirstImpl(myVal: MyType) extends FirstTrait { type U = MyType }

object SecondImpl extends SecondTrait[FirstImpl]

def func[T <: FirstTrait](myVal: T): myVal.U = ???

func(FirstImpl(myVal)): MyType

def func[T, U](myVal: T)(implicit ev: T <:< FirstTrait[U]): U = ???
def func[T <: FirstTrait[U],U](myVal: T): U    

问题是 myVal 的类型没有提到 U,所以编译器无法同时推断它与 T。如果它首先推断出 T,它可以从中得到 U,但它目前无法以这种方式工作。

不过,T在这里其实没什么用,可以改写成

def func[U](myVal: FirstTrait[U]): U    

您已经可以在此处传递 FirstTrait[U] 的任何子类型,并失去类型推断问题的根源。

如果这是一个简化的签名,一个可行的技巧是在参数类型中提到 U,即使它应该是多余的:

def func[T <: FirstTrait[U], U](myVal: T with FirstTrait[U]): U