【发布时间】:2014-05-03 07:26:34
【问题描述】:
我有一个 trait,它实现了一个在 supertrait 中定义的方法,没有参数。我的方法实现需要一个在特征上定义的类型参数,但我不能添加(implicit ct:ClassTag[Foo]),因为这会改变方法的参数列表,并且不再算作在超特征上实现方法。具体来说:
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]
}
我需要 FooPerformer 上的隐式 ClassTag 来处理实现中的擦除。就目前而言,我在Fooer 中的perform 上收到一个缺少ClassTag 的编译错误,但如果我将其更改为:
trait Fooer[Foo <: AbstractFoo] extends Performer {
def perform(implicit ct:ClassTag[Foo]) = new FooPerformer[Foo]
}
它不再在Performer 上实现perform。
【问题讨论】:
-
我没有收到缺少的
ClassTag错误,因此您的示例中缺少某些内容。您可以尝试使用ClassTag作为构造函数参数使Fooer成为一个类,除非Fooer真的必须是一个特征。 -
@wingedsubmariner 我刚刚回顾了导致这个问题的原始代码,
FooPerformer需要它自己的隐式ClassTag来处理更深层的擦除,我更新了问题以反映那个。
标签: scala reflection implicit