Scala Implicit Classtag不改变功能合同

时间:2014-05-02 20:53:21

标签: scala reflection implicit

我有一个特性,它实现了一个没有参数的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

1 个答案:

答案 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