2015-05-17 32 views
1

編寫測試以驗證在內部某處是否選擇了正確的類型類時,我遇到了類型擦除。我沒有加入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的運行時類型信息獲取的另一種方式?

+0

難道你不能測試是否通過簡單的相等性檢查選擇了正確的類型類嗎?我希望看到一個用例,其中的測試被擦除打破。 –

+0

順便說一句,你忘了'extend Foo',儘管在這種情況下它不會改變編譯器錯誤。 –

+0

@ m-z實際上你是正確的,在類型類的情況下,這不是一個問題,因爲這些是隱式對象,我可以在其上進行相等性測試。一旦我無法使用typeclass,我遇到了問題,因爲它正在接受自定義參數,並在case語句中實例化了不同的參數化類。我會嘗試在代碼片段中提取一個有意義的示例。 –

回答

0

如果您有運行時間值問題的類型,只需檢查該類型。只有在沒有有價值的證據時才需要班級標籤。

class FooStubImpl extends Foo { 
    override def bar[T: MyTypeClass](t: T): Unit = { 
    val clazz = t.getClass 
    } 
} 
+0

是的,這工作。謝謝。回到我的測試代碼,找出我有什麼不同,它抱怨說,由於類型擦除我的平等測試是無用的。我一定錯過了翻譯的東西 –

相關問題