2016-07-25 1 views
0

Je souhaite créer une fonction qui prend un type d'entrée SS <: ParentClass et S hérite également de SomeTrait. J'ai créé une solution en utilisant S <: ParentClass with SomeTrait et il compile bien, mais il rejette les entrées qui satisfont ces conditions.Fonction Scala qui requiert un type qui étend à la fois une classe et un trait

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*/) 
} 

Lorsque je tente d'utiliser:

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

Je reçois l'erreur:

<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)) 

Question bonus: comment puis-je obtenir la valeur d'un élément avec ce type, comme montré dans le code?

Répondre

1

Votre code me correspond, aussi bien dans Scala 2.11.8 que dans 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 console REPL est fondamentalement identique, donc je vais sauter.)

+0

Hm je testais dans Databricks, peut-être un artefact étrange que ... J'ai essayé dans le REPL et il fait typecheck, cependant il renvoie aussi un 'Unit' de la fonction' plus'. – spiffman

+0

Eh bien, votre fonction 'plus' ne spécifie pas ce qu'elle doit retourner. Je suppose que scala suppose que vous voulez dire 'Unit' quand vous ne spécifiez pas le type de retour d'une méthode abstraite. –