Scala隐式类标记,无需更改函数约定

Scala隐式类标记,无需更改函数约定,scala,reflection,implicit,Scala,Reflection,Implicit,我有一个trait,它实现了一个在supertrait中定义的没有参数的方法。我的方法实现需要一个在trait上定义的类型参数,但我不能添加(隐式ct:ClassTag[Foo]),因为这会更改方法的参数列表,并且不再算作在supertrait上实现方法。具体地说: import scala.reflect.ClassTag trait AbstractFoo trait Performance trait Performer {def perform:Performance} class

我有一个trait,它实现了一个在supertrait中定义的没有参数的方法。我的方法实现需要一个在trait上定义的类型参数,但我不能添加
(隐式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]
}

它不再在执行者上执行
Performer

@wingedsubmariner的意思是:

scala> class Fooer[Foo <: AbstractFoo : ClassTag] extends Performer {
     |   def perform = new FooPerformer[Foo]
     | }
defined class Fooer
scala>class-foore[Foo-trait-foore[Foo-class-Foob-extensed-foore[AbstractFoo]{
|受保护的def标记=reflect.classTag[AbstractFoo]
| }
定义类Foob

我没有得到缺少的
ClassTag
错误,因此您的示例中缺少了一些内容。您可以尝试使用
ClassTag
作为构造函数参数创建
foore
类,除非
foore
确实必须是一个特征。@wingedsubmariner我只是回顾了导致此问题的原始代码e和
FooPerformer
需要自己的隐式
ClassTag
来处理更深层次的擦除,我更新了问题以反映这一点。很高兴,谢谢!我选择了第二个选项,因为
Fooer
需要保留一个特征。
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