结构化打字可以与泛型一起使用吗?

时间:2014-01-13 20:37:01

标签: scala type-erasure

我有一个使用结构类型定义的接口:

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。有没有办法让泛型与结构类型一起工作?请注意,在这个特殊情况下,我能够使用实际特征而不是结构类型来解决我的问题,这总体来说更清晰。

1 个答案:

答案 0 :(得分:0)

简短回答是,apply方法参数会让您感到悲伤,因为它需要对参数(Int => Integer)进行一些隐式转换。隐含在编译时解决,NoSuchMethodException可能是由于这些缺失的隐含所致。

尝试使用values方法,因为没有使用隐含,所以它应该可以使用。

我试图找到一种方法让这个例子有效,但到目前为止还没有成功。