我有一个使用结构类型定义的接口:
trait Foo {
def collection: {
def apply(a: Int) : String
def values() : collection.Iterable[String]
}
}
}
我想让这个接口的一个实现者使用标准的可变HashMap来实现:
class Bar {
val collection: HashMap[Int, String] = HashMap[Int, String]()
}
它编译,但在运行时,当通过Foo类型变量引用Bar实例时,我得到NoSuchMethod异常。通过反射转出对象的方法我发现HashMap的apply方法由于类型擦除而接受一个Object,并且有一些疯狂重命名生成的apply方法确实采用了int。有没有办法让泛型与结构类型一起工作?请注意,在这个特殊情况下,我能够使用实际特征而不是结构类型来解决我的问题,这总体来说更清晰。
答案 0 :(得分:0)
简短回答是,apply方法参数会让您感到悲伤,因为它需要对参数(Int => Integer
)进行一些隐式转换。隐含在编译时解决,NoSuchMethodException
可能是由于这些缺失的隐含所致。
尝试使用values
方法,因为没有使用隐含,所以它应该可以使用。
我试图找到一种方法让这个例子有效,但到目前为止还没有成功。