【发布时间】:2015-05-30 01:42:53
【问题描述】:
给定一个给定特征的具体类
trait Trt {
val x: Int
}
class C extends Trt {
val x: Int = 3
}
我想创建一个参数类型的匿名类的对象,以覆盖属性x
abstract class SomeClass[T <: Trt : ClassTag] {
def f: Unit = {
val original = new C
//Is this even possible?
val withOverridenX = new T { override val x = 42}
assert(original.x != withOverridenX.x)
}
}
问题是编译器一直报如下错误:
>> Error:(26, 35) class type required but T found
实例化匿名类是否可以扩展参数类型类?
我知道问题在于T 是一个类型而不是一个类,我想知道是否有可能,感谢 ClassTag 有界上下文,是否可以实例化 withOverridenX。
【问题讨论】:
-
@sjrd 有没有办法,例如使用 ClassTag,能够实例化一个参数类型的匿名类(是的,我知道它是一种类型)在运行时提供类信息,并且以某种方式,使用它?
-
不,没有办法做到这一点,即使是
ClassTag。你需要一个TypeTag和编译时反射(宏)来做到这一点,我猜(我不完全知道如何)。 -
感谢您的 cmets 并祝贺 Scala.js,它帮助我说明了 Scala for mi 博客的一些用途:(只是示例,不是博客)orionsword.no-ip.org/demos/pi_scalajsorionsword.no-ip.org/demos/sierpinski_publish
-
@sjrd 只是为了记录,我发现了一个使用 Scala 反射的肮脏解决方法(下面的自动答案)
标签: scala