如何定义所有使用递归类型签名扩展共同特征的对象类型

时间:2016-06-28 22:39:31

标签: scala elastic4s

我写了一个返回所有扩展共同特征的对象的方法。我想将返回类型指定为具有该特征的对象。复杂的是特征具有递归类型签名。

特别是,我正在使用elastic4s并查看aggregationDefinition trait。特征定义是:

trait AggregationDefinition[+Self <: AggregationDefinition[Self, B], B <: AggregationBuilder[B]]

我的方法的简化版本是:

def asAggregation(): AggregationDefinition = {
  aggType match {
    case "terms" => aggregation.terms(aggName).field(key)
    case "cardinality" => aggregation.cardinality(aggName).field(key)
  }
}

复杂性在于AggregationDefinition,它需要类型参数:

Error: trait AggregationDefinition takes type parameters

我对特征定义中的递归和交叉引用感到困惑,我不清楚类型参数应该是什么。我应该将什么用于类型参数?

1 个答案:

答案 0 :(得分:0)

AggregationDefinition需要类型绑定(请参阅类型签名),您可以使用AbstractAggregationDefinition,例如:

def asAggregation(): AbstractAggregationDefinition = {
  aggType match {
    case "terms" => aggregation.terms(aggName).field(key)
    case "cardinality" => aggregation.cardinality(aggName).field(key)
  }
}