Pourquoi le code ci-dessous ne compile pas?erreur de compilation étrange avec des existences scala avec polymorphisme borné f
trait B[T <: B[T]]
case class A[T <: B[T]](t: T)
class C() extends B[C]
val c: C = new C()
val r2: A[_] = A(c) //compiles
val r3: A[_] = A(c) //compiles fine
val r4: A[_] = r3 //compiles fine
val r5: (A[_]) = (r3) //compiles fine
val r6: (A[_], A[_]) = (r3, r3) // does not compile, strange
Il donne:
Error:(68, 22) type arguments [_$7] do not conform to class A's type parameter bounds [T <: _experiment.akka_persistence.Test2.B[T]]
val r6:(A[_],A[_])=(r3,r3)
EDIT:
est ici un apparenté, autonome extrait de code:
import scala.language.existentials
trait B[T <: B[T]]
case class A[T <: B[T]](t: T)
class C() extends B[C]
val c: C = new C()
type SomeB = T forSome { type T <: B[T] }
val r3: A[_<:SomeB] = A(c) //compiles fine
val r4: A[C] = A(c) //compiles fine
val r5: (A[_<:SomeB]) = (r3) //compiles fine
val r6:((_<:SomeB),((_<:SomeB))) = (c,c) // compiles fine
val r7:(A[_<:SomeB],((_<:SomeB))) = (A(c),c) // compiles fine
val r8:(A[_<:SomeB],(A[_<:SomeB])) = (A(c),A(c)) // compiles fine
val r10:(A[_<:SomeB],(A[_<:SomeB])) = (A(c),r4) // compiles fine
val r9:(A[_<:SomeB],(A[_<:SomeB])) = (A(c),r3) // does not compile
- Il semble que
r4
doit avoir le type deA[C]
puisr10
compile. Cela suggère donc queA[_<:SomeB]
pourr3
n'est pas assez spécifique. Mais pourquoi pas ? - Aussi pourquoi est
A[_<:SomeB]
assez pourval r5: (A[_<:SomeB]) = (r3)
mais pas pourr9
?
hmmm, cela semble être un peu pertinent: http://stackoverflow.com/questions/28674486/existential-types-for-f-bounded-polymorphic-types-and-non-generic-subtypes – jhegedus
On dirait un autre bug. Votre premier extrait compile bien avec dotty/master. – OlivierBlanvillain
Hmm .... étrange ... devrais-je commencer à utiliser dotty? :) – jhegedus