Невозможно BusinessLogic
просто получить Data
при строительстве.Если RealTimeData
и HistoricalData
не имеют общего предка (это , это ваша проблема?), То, вероятно, лучше всего определить службу, используемую BusinessLogic
, как черту и добавить неявные преобразования.
trait Data { def onEvent(obj: Any) }
object Data {
implicit def fromRealTime(r: RealTimeData) = new Data{
def onEvent(obj: Any) = r.onEvent(obj)
// same for Historical
}
class BusinessLogic[D <% Data](data: D)
В качестве альтернативы, вам нужно добавить поведение в свой класс данных Java, опять же, неявным может быть путь.Тем не менее, с чертой data
, неявными преобразованиями и параметром в конструкторе, вы можете добавить еще одно неявное преобразование
object BusinessLogic {
implicit def extendedWithBusinessLogic[D <% Data](data: D) = new BusinessLogic(data)
}
Наконец, вы также можете рассмотреть структурные типы, наиболее близкие к тому, что вы пробовали,но я не уверен, что понимаю, зачем:
type Data = {def onEvent(obj: Any)}
trait BusinessLogic{self: Data =>
def onSeveralEvents(objs: Any*) = for (obj <- objs) onEvent(obj)
}
val historicalWithBusiness = new HistoricalData with BusinessLogic