是否可以定义表示多个数据类型的类型别名?
package object scala {
type SingleDimension = Double
type MultiDimensionMap = Map[String, Double]
type MultiDimensionList = List[Tuple2[String, Double]]
}
Run Code Online (Sandbox Code Playgroud)
例如,我需要一个suptertype让我们说DataDimension只代表三种类型.所以我可以做到以下几点:
trait AbstractDataWorker[T] {
def formula(d: Double): T
}
class multiDimensionWorker extends AbstractDataWorker[MultiDimensionMap] {
type T = MultiDimensionMap
override def formula(d: Double): MultiDimensionMap = {
Map[String, Double]()
}
}
class singleDimensionWorker extends AbstractDataWorker[SingleDimension] {
type T = SingleDimension
override def formula(d: Double): SingleDimension = {
2.0
}
}
Run Code Online (Sandbox Code Playgroud)
但是下面应该给出编译错误.目前它的作品.
class stringDimensionWorker extends AbstractDataWorker[String] {
type T = String
override def formula(d: Double): String = {
"hello"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使它们成为扩展单个特征而不是类型别名的真实类:
sealed trait DimensionLike
case class SingleDimension(value: Double) extends DimensionLike
case class MultiDimensionMap(value: Map[String, Double]) extends DimensionLike
case class MultiDinmensionList(value: List[(String, Double)]) extends DimensionLike
abstract class AbstractDataWorker[T <: DimensionLike] {
def formula(d: Double): T
}
class MultiDimensionWorker extends AbstractDataWorker[MultiDimensionMap] {
// ...
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以为这些类型别名创建一个带有隐式实现的类型类.然后创建AbstractDataWorker一个abstract class,并将此类型类的上下文绑定添加到其类型参数:
type SingleDimension = Double
type MultiDimensionMap = Map[String, Double]
type MultiDimensionList = List[(String, Double)]
sealed trait IsDimensionLike[T]
object IsDimensionLike {
implicit object singleDimension extends IsDimensionLike[SingleDimension]
implicit object multiDimensionMap extends IsDimensionLike[MultiDimensionMap]
implicit object multiDimensionList extends IsDimensionLike[MultiDimensionList]
}
abstract class AbstractDataWorker[T : IsDimensionLike] {
def formula(d: Double): T
}
class MultiDimensionWorker extends AbstractDataWorker[MultiDimensionMap] {
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2292 次 |
| 最近记录: |