【问题标题】:Can structural typing work with generics?结构类型可以与泛型一起使用吗?
【发布时间】:2014-01-13 20:37:01
【问题描述】:

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

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

【问题讨论】:

  • 您能否添加一个示例来说明您如何使用它并获得异常?

标签: scala type-erasure


【解决方案1】:

简短的回答是,apply 方法参数让你很伤心,因为它需要对参数进行一些隐式转换 (Int => Integer)。隐含在编译时被解析,NoSuchMethodException 可能是这些隐含缺失的结果。

尝试使用values 方法,它应该可以工作,因为没有使用任何隐式。

我试图找到一种方法来使这个示例工作,但到目前为止还没有成功。

【讨论】:

    猜你喜欢
    • 2021-08-09
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多