2015-09-21 28 views
3

本質上強制執行的Scala特質的類型,我想做到以下幾點:使用通用

trait Foo[T] extends T { 
    def json: Writes[T] 
    def bar: String = { 
    Json.toJson[T](this)(json).toString 
    } 
} 

我希望編譯器執行,使用特質任何類的類型是T.不幸的,「延長T'無效。現在,我能做的最好的是:

trait Foo[T] extends T { 
    def json: Writes[T] 
    def bar: String = { 
    Json.toJson(this.asInstanceOf[T])(json).toString 
    } 
} 

但顯然,編譯器沒有執行任何操作。無論如何要實現我想要的?

+0

Foo [T]擴展T是否有意義,例如: Foo 在Java中擴展字符串?也許我錯過了一些東西。 –

回答

5

可以使用self type來要求延長Foo[T]任何類也成爲T一個實例:

import play.api.libs.json._ 

trait Foo[T] { self: T => 
    def json: Writes[T] 
    def bar: String = Json.toJson[T](self)(json).toString 
} 

你可以使用任何你想要的地方self任何名義(這僅僅是一個常見的約定)。