我有一个特性,它实现了一个没有参数的supertrait中定义的方法。我对该方法的实现需要一个在trait上定义的类型参数,但是我不能添加(implicit ct:ClassTag[Foo])
,因为这会改变方法的参数列表,并且它不再算作在supertrait上实现该方法。具体地:
import scala.reflect.ClassTag
trait AbstractFoo
trait Performance
trait Performer {def perform:Performance}
class FooPerformer[Foo <: AbstractFoo](implicit ct:ClassTag[Foo]) extends Performance {
// do things
}
trait Fooer[Foo <: AbstractFoo] extends Performer {
def perform = new FooPerformer[Foo]
}
我需要ClassTag
上的隐式FooPerformer
来处理实现中的擦除。就目前而言,我在ClassTag
perform
的{{1}}上发现了Fooer
的编译错误,但如果我将其更改为:
trait Fooer[Foo <: AbstractFoo] extends Performer {
def perform(implicit ct:ClassTag[Foo]) = new FooPerformer[Foo]
}
它不再在perform
上实现Performer
。
答案 0 :(得分:3)
@wingedsubmariner意思是:
scala> class Fooer[Foo <: AbstractFoo : ClassTag] extends Performer {
| def perform = new FooPerformer[Foo]
| }
defined class Fooer
此外,
scala> trait Fooer[Foo <: AbstractFoo] extends Performer {
| implicit protected def tag: ClassTag[Foo]
| def perform = new FooPerformer[Foo]
| }
defined trait Fooer
scala> class Foob extends Fooer[AbstractFoo] {
| protected def tag = reflect.classTag[AbstractFoo]
| }
defined class Foob