[英]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]
编辑
我在 function 中使用了两种类型:
def func[T <: FirstTrait[U],U](myVal: T): U
当我使用存在类型时,我必须显式类型,否则会出现"inferred type arguments [FirstImpl,Nothing] do not conform to method func"
错误。
所以这就是我必须如何实现 function:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.