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
我有一个像这样的第一个 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