編寫測試以驗證在內部某處是否選擇了正確的類型類時,我遇到了類型擦除。我沒有加入ClassTag
到簽名的選項,除非我還污染特徵的非測試版本,因爲加入: ClassTag
改變方法簽名,以便它不再是一個替代,如:無法指定ClassTag時獲取運行時類信息
trait Foo {
def bar[T: MyTypeClass](t: T): Unit
}
class FooStubImpl extends Foo {
override def bar[T: MyTypeClass: ClassTag](t: T): Unit = {
val ct = classTag[T]
}
}
這將導致以下編譯錯誤:
Error:(12, 20) method bar overrides nothing Note: the super classes of class FooStubImpl contain the following, non final member named bar:
override def bar[T](t: T)(implicit evidence$1: MyTypeClass[T]): Unit = { ^
有沒有在參數化類型,不需要ClassTag
的運行時類型信息獲取的另一種方式?
難道你不能測試是否通過簡單的相等性檢查選擇了正確的類型類嗎?我希望看到一個用例,其中的測試被擦除打破。 –
順便說一句,你忘了'extend Foo',儘管在這種情況下它不會改變編譯器錯誤。 –
@ m-z實際上你是正確的,在類型類的情況下,這不是一個問題,因爲這些是隱式對象,我可以在其上進行相等性測試。一旦我無法使用typeclass,我遇到了問題,因爲它正在接受自定義參數,並在case語句中實例化了不同的參數化類。我會嘗試在代碼片段中提取一個有意義的示例。 –