Kimin örneklerini bana bazı türünde bir değeri verecektir basit tip sınıf var varsayalım:örnekleri bir kovaryant tip sınıfın örneklerini oluşturma olmayan bir kovaryant bir
trait GiveMeJustA[X] { def apply(): X }
Ve bende bazı durumlarda:
trait GiveMeA[+X] { def apply(): X }
:
case class Foo(s: String)
case class Bar(i: Int)
implicit object GiveMeJustAFoo extends GiveMeJustA[Foo] {
def apply() = Foo("foo")
}
implicit object GiveMeJustABar extends GiveMeJustA[Bar] {
def apply() = Bar(13)
}
Şimdi aynı şeyi yapar ancak türünü parametresinde covariant bir tip benzer (ama ilgisiz) sınıf var Bir almak için tek bir yol var çünkü
object GiveMeA {
implicit def fromGiveMeJustA[X](implicit giveMe: GiveMeJustA[X]): GiveMeA[X] =
new GiveMeA[X] { def apply() = giveMe() }
}
Şimdi, sadece iyi derlemek için implicitly[GiveMeA[Foo]]
beklediğiniz: onun arkadaşı nesnede
bizim olmayan kovaryant tip sınıfının örnekleri gelen örneklerini oluşturmak için nasıl derleyici anlatmak GiveMeA[Foo]
Burada sahip olduğumuz parçalar verilmiştir. Ama öyle değil (en azından 2.10.4 veya 2.11.2 ya üzerine):
GiveMeJustA
örneğinin kurtulmak ise
scala> implicitly[GiveMeA[Foo]]
<console>:16: this.GiveMeA.fromGiveMeJustA is not a valid implicit value for GiveMeA[Foo] because:
hasMatchingSymbol reported error: ambiguous implicit values:
both object GiveMeJustAFoo of type GiveMeJustAFoo.type
and object GiveMeJustABar of type GiveMeJustABar.type
match expected type GiveMeJustA[X]
implicitly[GiveMeA[Foo]]
^
<console>:16: error: could not find implicit value for parameter e: GiveMeA[Foo]
implicitly[GiveMeA[Foo]]
^
, çalışır: Bu içindedir
scala> implicit def GiveMeJustABar: List[Long] = ???
GiveMeJustABar: List[Long]
scala> implicitly[GiveMeA[Foo]]
res1: GiveMeA[Foo] = [email protected]
GiveMeA[Foo]
(veya GiveMeA[Foo]
'un herhangi bir alt türünü) almak için bu örneğin GiveMeA.fromGiveMeJustA
'u uygulamamızın hiçbir yolu olmamasına rağmen.
Bu benim için bir hataya benziyor, ancak bir şeyleri kaçırmam mümkün. Bu bir anlam ifade ediyor mu? Makul bir çözüm var mı?
çözüm için çalışıyor şikayet verilen örnek. Ama benim durumumda, 'GiveMeJustA' kullanılmakta olan' Generic' kullanıyorum. Ve bu durumda çözüm işe yaramaz gibi görünüyor, sanırım makrolar yüzünden. – tksfz