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