2016-06-28 1 views
0

Я написал метод, который возвращает объекты, которые расширяют общий признак. Я хочу указать тип возвращаемого объекта как объект с этим признаком. Усложнение состоит в том, что признак имеет рекурсивную подпись типа.Как определить тип объектов, которые все расширяют общий признак с рекурсивной сигнатурой типа.

В частности, я использую 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 

Я смущен по рекурсии и перекрестной ссылке в определении признаков, и мне непонятно, какие параметры типа должны быть. Что я должен использовать для параметров типа?

ответ

0

AggregationDefinition потребность типа Bound (см сигнатуру типа), вы можете использовать AbstractAggregationDefinition, как:

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

То, что вы предлагаете работает просто отлично. Однако мне нужно вызвать 'aggregations' для объектов, возвращаемых' asAggregation'. Я хочу вернуть 'AggregationDefinition', потому что именно здесь определены« агрегации ». – canzar