Scala隐式类型上限?

Scala隐式类型上限?,scala,generics,type-inference,type-bounds,Scala,Generics,Type Inference,Type Bounds,我的第一个特点是: trait FirstTrait[U] { val myVal: U } 另一份如下: trait SecondTrait[T <: firstTrait[U],U] 如果可能的话,有没有更好的方法来做同样的事情,我想简化第二个特性的实现: object SecondImpl extends SecondTrait[FirstImpl] 编辑 我在函数中使用这两种类型之后: def func[T <: FirstTrait[U],U](myVal:

我的第一个特点是:

trait FirstTrait[U] {
  val myVal: U
}
另一份如下:

trait SecondTrait[T <: firstTrait[U],U]
如果可能的话,有没有更好的方法来做同样的事情,我想简化第二个特性的实现:

object SecondImpl extends SecondTrait[FirstImpl]
编辑

我在函数中使用这两种类型之后:

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

有什么可以简化的吗?

你可以试试存在主义类型

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[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

您已经可以在这里传递FirstTrait[U]的任何子类型,并丢失类型推断问题的根源

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

def func[T <: FirstTrait[U], U](myVal: T with FirstTrait[U]): U    
您已经可以在这里传递FirstTrait[U]的任何子类型,并丢失类型推断问题的根源

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

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

谢谢,我用的是存在主义类型,很有效!但我的问题转移到别处了。如果你有问题,我已经编辑了我的问题idea@LucE使用我的第二种方法可以定义def func[T@LucE,或者使用第一种方法可以添加类型_U:trait FirstTrait[U]{type _U=U;val myVal:U}并定义def func[T谢谢你,这真是个好主意。我用你的答案解决了我的问题,答案是existant类型,答案是@alexey romanov,参数中提到U,这更简单implement@LucE除了阿列克谢·罗曼诺夫的变体之外,还有一个变体是def func[T,U]myVal:Timplicit ev:T谢谢,我使用了存在主义类型,它很有效!但是我的问题转移到了其他地方。如果你有问题,我已经编辑了我的问题idea@LucE使用我的第二种方法可以定义def func[T@LucE,或者使用第一种方法可以添加类型_U:trait FirstTrait[U]{type _U=U;val myVal:U}并定义def func[T谢谢你,这真是个好主意。我用你的答案解决了我的问题,答案是existant类型,答案是@alexey romanov,参数中提到U,这更简单implement@LucE除了阿列克谢罗曼诺夫的变体之外,还有一个变体是def func[T,U]myVal:Timplicit ev:T
def func[T, U](myVal: T)(implicit ev: T <:< FirstTrait[U]): U = ???
def func[T <: FirstTrait[U],U](myVal: T): U    
def func[U](myVal: FirstTrait[U]): U    
def func[T <: FirstTrait[U], U](myVal: T with FirstTrait[U]): U