scala – 如何将类型模式与子类型进行组合?
发布时间:2020-12-16 09:18:20 所属栏目:安全 来源:网络整理
导读:假设我在 Scala中使用了typeclass模式.这是我如何做一个C类 部分类型Foo: Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM,Java 1.6.0_26).scala trait Foo[T] { def foo(t: T) }defined trait Fooscala def foo[T : Foo](t: T) { im
假设我在
Scala中使用了typeclass模式.这是我如何做一个C类
部分类型Foo: Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM,Java 1.6.0_26). scala> trait Foo[T] { def foo(t: T) } defined trait Foo scala> def foo[T : Foo](t: T) { implicitly[Foo[T]].foo(t) } foo: [T](t: T)(implicit evidence$1: Foo[T])Unit scala> class C defined class C scala> foo(new C) <console>:11: error: could not find implicit value for evidence parameter of type Foo[C] foo(new C) ^ scala> implicit object FooC extends Foo[C] { override def foo(c: C) { println("it's a C!") } } defined module FooC scala> foo(new C) it's a C! 到现在为止还挺好.但是假设我有C的子类D,我想要D的实例也是“in”的类型: scala> class D extends C defined class D scala> foo(new D) <console>:13: error: could not find implicit value for evidence parameter of type Foo[D] foo(new D) ^ 卫生署!如何使这项工作不必为D显式提供一个类型实例? 解决方法
这有不同的可能的解决方案,这取决于我是否要解决问题只为C,或者我是否要解决整个类型类的问题.
对于C,而不是隐式对象FooC …我们说: implicit def CIsFoo[T <: C]: Foo[T] = new Foo[T] { override def foo(t: T) { println("it's a C!") } } 要修复所有的Foo,使它是相反的: trait Foo[-T] { def foo(t: T) } 或者如果由于某种原因你不能或不想这样做,你可以用以下代替def foo …: def foo[T](t: T)(implicit foo: Foo[_ >: T]) = foo.foo(t) (感谢#scala denizens Daniel Sobral和Stefan Zeiger的帮助.) 2011年9月20日更新,包括我想念的“make Foo逆向”解决方案 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |