[英]Struggling with implicit resolution when trying to pass a generic class to my csvloader
我有點困惑為什么這不起作用......
為了學習 shapeless,我正在實現每個人最喜歡的 csv 加載程序。 它在很大程度上有效,我可以做類似的事情
val caseClasses = CSVConverter[ConcreteImplementationOfACaseClass].from(rowParsedFromFile)
但是,當我嘗試將方法調用的簽名更改為
def genericWrapper[T <: Product]() = {
CSVConverter[T].from(rowParsedFromFile)
}
然后做類似的事情
val test = genericWrapper[ConcreteImplementationOfACaseClass]
我收到“找不到 T 類型的惰性隱式值”的錯誤
我有點納悶……怎么會這樣? 我只是簡單地用一個具體類型代替了一個注定要成為產品的通用類型。 似乎信息在我的實現中丟失了。
還是我離這里很遠? 當我想到它時,我的建議是我的實現可以將字符串反序列化為任何產品,因為它是完全通用的。 Shapeless 不知道我只會問一個具體的實現。
如果我將 T 綁定為有限的案例類集,我有能力從字符串轉換為類型,這會起作用嗎? 或者更好的是,我可以以某種方式綁定 T 以便在任何情況下 class 的輸入都是字符串(或我實現的有限轉換集),所以我不必構建這么長的具體類型列表?
我假設您在https://github.com/milessabin/shapeless/blob/main/examples/src/main/scala/shapeless/examples/csv.scala中引用CSVConverter
您剛剛錯過了上下文綁定: CSVConverter
def genericWrapper[T <: Product : CSVConverter]() = {
CSVConverter[T].from(rowParsedFromFile)
}
為所有案例類定義了 class CSVConverter
類型的實例,但T <: Product
並不意味着T
類型是案例 class ( 類型多於類),因此您需要上下文綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.