2017-10-16 5 views
0

私はキー値のペアを取るクラスを持っています。これはマップオブジェクトやケースクラスなどの形式になります。既存のクラスがスカラで特性を実装するようにする

trait Reportable { 
    def getAttributes : Map[String,Any] 
    } 

リスト[レポート可能]を取るメソッドが必要です。報告のための 可能な実装は、以下のとおりです。

  • 実装はちょうど私がケースクラスから属性を取るためにリフレクションを使用して何かを使用して、マップ
  • にそれを置くことができるケースクラス
  • そのものだろうマップ

問題は、Product(すべての大文字小文字のクラスの基本クラス)を作成する方法とMapクラスが自分の特色を実装する方法がわかりません。私は既存のクラスを取って、報告可能な特性をミックスし、クラスがすでに持っているメソッドの観点から実装できるようにしたい。

答えて

4

このような形質を混ぜることはできません。

しかし、imhoは、EnrichMyLibraryのケースのように聞こえますパターン。 Mapの例:

trait Reportable { 
    def getAttributes : Map[String,Any] 
} 

object Reportable { 
    implicit class MapReportableOps(private val underlying: Map[String, Any]) extends Reportable { 
    def getAttributes: Map[String, Any] = underlying 
    } 
} 

使用法:

val reportables: List[Reportable] = Map("foo" -> "bar") :: Nil 

コンパイラはReportableが期待されている場所の地図のための暗黙のラッパークラスMapReportableOpsを見つけ、Reportableを作成する必要があります。

+0

違法継承を試みるとエラーが表示されます。スーパークラスAnyVal はsuperclassオブジェクトのサブクラスではありません。 mixin特性のレポート可能 暗黙のクラスMapReportableOps(プライベートvalの基礎:Map [String、Any])は、ReportableでAnyValを拡張します。私はスカラーです2.11 –

+2

'extends AnyVal'を削除するだけです。 –

関連する問題