2011-08-31 89 views
7

我正在使用Jersey JAX-RS參考實現在Scala中開發REST web服務,並且出現一個奇怪的錯誤。Scala類型(推理)問題?

我正在嘗試使用ContentDisposition.ContentDispositionBuilder創建一個ContentDisposition對象。

ContentDisposition.ContentDispositionBuilder有兩種類型T extends ContentDisposition.ContentDispositionBuilderV extends ContentDispositionContentDisposition的方法type返回一個構建器實例。

代碼

val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).build() 

作品不過

val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy").build() 

產生編譯器錯誤

error: value build is not a member of ?0 
val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy").build() 
                             ^

(注意,要放在type需要在 「引號」,因爲它是一個關鍵字在斯卡拉)

fileNameContentDispositionBuilder返回T的實例,所以這實際上應該工作。

我不明白這一點。任何想法? 我正在使用Scala 2.9.0.1。

更新:

這工作。但爲什麼我需要在這裏投射?

val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM) 
    .fileName("dummy") 
    .asInstanceOf[ContentDisposition.ContentDispositionBuilder[_,_]] 
    .build() 
+0

難道只是我還是沒有你的鏈接似乎工作? – agilesteel

+0

看起來java.net目前處於關閉狀態:-( –

+1

該錯誤與Java通配符和Scala存在之間的互操作有關,雖然類似,但這兩種類型的系統功能並不相同,這是在黑暗中拍攝的,但它可能是值得嘗試剛剛發佈的Scala 2.9.1 –

回答

2

我猜類型推理只能走到目前爲止......你可以做兩行,而不必做任何演員;你試過這個嗎?

val something=ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM) 
val contentDisposition=something.fileName("dummy").build() 

也許

val builder=ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy") 
val contentDisposition=builder.build()