Perché questo non viene compilato?
L'errore dato è class SomeElement needs to be abstract, since method eval in trait Element of type [T <: Typed]=> scala.util.Try[T] is not defined
Perché scalac non crede che un metodo non si adatti alla firma del tipo richiesto?
non riesco a capire il motivo per cui il metodo eval
definita sulla SomeElement non soddisfa i vincoli di tipo.
Come ho capito, eval
dovrebbe restituire qualcosa racchiuso in un Try
che sottoclasse Typed
. La prova è covariante nel suo parametro tipo. L'implementazione di eval
in SomeElement
restituisce una sottoclasse NumberLike
sottoclasse Typed
. Allora, cosa c'è che non va?
import scala.util.Try
trait Element {
def eval[T <: Typed]: Try[T]
}
trait Typed
case class NumberLike(n: Long) extends Typed
case class SomeElement(n: Long) extends Element {
def eval = Try {
NumberLike(n)
}
}
object app extends Application {
println (SomeElement(5).eval)
}
Cercando di aggiungere un parametro di tipo esplicito a eval in SomeElement
non aiuta:
case class SomeElement(n: Long) extends Element {
def eval[NumberLike] = Try {
NumberLike(n)
}
}
Modifica alla definizione di SomeElement a quanto sopra dà:
found : <empty>.NumberLike
required: NumberLike(in method eval)
NumberLike(n)
EDIT Mi piacerebbe davvero sapere perché non viene compilato. Soluzioni alternative per il problema sono utili, ma voglio davvero sapere cosa sta succedendo qui.
non posso scrivi una risposta completa ora, ma sicuramente, non puoi eseguire l'override/implementare la funzione poly con il parametro type by function senza di essa; quindi devi scrivere smth come 'def eval [T: NumberLike] = ...' – DaunnC
Perché 'tratto astratto '? – cchantep
@DaunnC vedi modifica – Squidly