2016-07-25 120 views
0

我想做一個輸入類型爲S的函數,其中S <: ParentClassS也繼承SomeTrait。我使用S <: ParentClass with SomeTrait創建了一個解決方案,它編譯得很好,但它拒絕滿足這些條件的輸入。斯卡拉功能,需要擴展類和特徵的類型

abstract class Units[T](v: T) { def getVal = v} 

trait Dimension 
trait Time extends Dimension 

trait Quantity[T <: Dimension] 
trait Instance[T <: Dimension] { 
    def plus[S <: Units[_] with Quantity[T]](q: S) 
} 

case class Seconds(v: Double) extends Units(v) with Quantity[Time] { 
} 
case class Timestamp(i: Int) extends Units(i) with Instance[Time] { 
    def plus[T <: Units[_] with Quantity[Time]](quantity: T) = Timestamp(2345/*placeholder value*/) 
} 

當我嘗試使用此:

Timestamp(5).plus(Seconds(4)) 

我得到的錯誤:

<console>:46: error: inferred type arguments [Seconds] do not conform to method plus's type parameter bounds [T <: Units[_] with Quantity[Time]] 
       Timestamp(5).plus(Seconds(4)) 
         ^
<console>:46: error: type mismatch; 
found : Seconds 
required: T 
       Timestamp(5).plus(Seconds(4)) 

獎金的問題:我如何才能與該類型項目的價值,在代碼中顯示?

回答

1

對於我來說,無論是在Scala 2.11.8還是在Scala 2.10.6中,您的代碼都是我的代碼。

> console 
[info] Starting scala interpreter... 
[info] 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_31). 
Type in expressions for evaluation. Or try :help. 

scala> abstract class Units[T](v: T) { def getVal = v} 
defined class Units 

scala> 

scala> trait Dimension 
defined trait Dimension 

scala> trait Time extends Dimension 
defined trait Time 

scala> 

scala> trait Quantity[T <: Dimension] 
defined trait Quantity 

scala> trait Instance[T <: Dimension] { 
    | def plus[S <: Units[_] with Quantity[T]](q: S) 
    | } 
defined trait Instance 

scala> 

scala> case class Seconds(v: Double) extends Units(v) with Quantity[Time] { 
    | } 
defined class Seconds 

scala> case class Timestamp(i: Int) extends Units(i) with Instance[Time] { 
    | def plus[T <: Units[_] with Quantity[Time]](quantity: T) = Timestamp(2345/*placeholder value*/) 
    | } 
defined class Timestamp 

scala> Timestamp(5).plus(Seconds(4)) 

(A 2.10.6 REPL控制檯是基本一致的,所以我會跳過它。)

+0

嗯,我在Databricks測試,也許一些奇怪的神器......我試圖在REPL它確實是typecheck,但它也從'plus'函數返回一個'Unit'。 – spiffman

+0

那麼,你的'加號'函數沒有指定它應該返回的內容。當你沒有指定抽象方法的返回類型時,我猜scala假定你的意思是「Unit」。 –