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