scala – Subclass中的特定参数类型不可能
发布时间:2020-12-16 18:38:09 所属栏目:安全 来源:网络整理
导读:我确实遇到以下代码的问题.它不编译. 有没有人知道如何在不使用asInstanceOf [SomeImpl]或模式匹配的情况下进行编译. 我正在考虑使用上限或下限的一些类型参数. object InherenceTryout extends App { import someimpl._ val list = List(SomeImpl("A"),Some
我确实遇到以下代码的问题.它不编译.
有没有人知道如何在不使用asInstanceOf [SomeImpl]或模式匹配的情况下进行编译. 我正在考虑使用上限或下限的一些类型参数. object InherenceTryout extends App { import someimpl._ val list = List(SomeImpl("A"),SomeImpl("B")) val result = new SomeHandler().handleBaseList(list) println("%s->%s" format (list,result)) } package base { // Defines that a 'Base' object can create a new // 'Base' object where another 'Base' object is mixed in // Does not define how the mixing will take place trait Base { def mix(other: Base): Base } // Defines how a default 'Base' object gets mixed into a list of 'Base' objects trait BaseHandler { def defaultBase: Base def handleBaseList(list: List[Base]): List[Base] = list.map(b => b.mix(defaultBase)) } } package someimpl { import base._ // Some implementation of 'Base' // Defines how a new 'SomeImpl' object is created by mixing in another // 'SomeImpl' object // ERROR: // class SomeImpl needs to be abstract,since method mix in trait Base of type (other: base.Base)base.Base is not defined // (Note that base.Base does not match someimpl.SomeImpl: class SomeImpl in // package someimpl is a subclass of trait Base in package base,but method parameter types must match exactly.) case class SomeImpl(id: String) extends Base { def mix(other: SomeImpl): SomeImpl = SomeImpl("[%s|%s]" format (id,other.id)) } // Defines the default 'SomeImpl' object class SomeHandler extends BaseHandler { def defaultBase = SomeImpl("D") } } 解决方法
使用类型参数:
package base { trait Base[T <: Base[T]] { def mix(other: T): T } trait BaseHandler[T <: Base[T]] { def defaultBase: T def handleBaseList(list: List[T]): List[T] = list.map(b => b.mix(defaultBase)) } } package someimpl { import base._ case class SomeImpl(id: String) extends Base[SomeImpl] { def mix(other: SomeImpl): SomeImpl = SomeImpl("[%s|%s]" format (id,other.id)) } class SomeHandler extends BaseHandler[SomeImpl] { def defaultBase = SomeImpl("D") } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |