Je souhaite créer une fonction qui prend un type d'entrée S
où S <: 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?
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
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. –