我用更高级的kinded类型和complilers类型推断进行了一些争论...... 我确实有以下课程:
sealed trait Foo[A] {
@JsonProperty val payload : List[A] = Nil
}
class Baa extends Foo[MyCoolClassOne]
class FooBaa extends Foo[MyCoolClassTwo]
现在我有一个函数,它调用一个REST-API来获取代表Baa或FooBaa的JSON响应(或Foo的其他子类,在这个例子中只提到其中的两个)。
def getContent[A, F <: Foo[A]](url: String) : List[A] = {
// call API
// use com.fasterxml.jackson.databind.ObjectMapper to deserialize
// psuedo code...
val response = mapper.readValue(responseFromAPI, classTag.runtimeClass.asInstanceOf[Class[F]])
return response.payload
}
然后我可以调用API来获取我的内容:
def getBaa(urlToBaa:String) = getContent[MyCoolClassOne, Baa](urlToBaa)
或
def getFooBaa(urlToFooBaa:String) = getContent[MyCoolClassTwo, FooBaa](urlToFooBaa)
为什么我需要将classTags传递给funtion getContent? 我该如何避免?
Foo是一个密封的特质。 (在这个例子中)只有2个类扩展它。这两个类都使用特定类型扩展Foo。为什么编译器无法推断出类型是否正确,如果我将函数定义为somethign,如下所示:
def getContent[F <: Foo[A]](url: String) : List[A] = { ... }
我知道,在这种情况下编译器会查找一个类'A'。但我怎么能告诉他,这是Foo子类的类型信息。
或者更确切地说,我不关心方法声明,但是每次调用它时,将一个“明显的”类型信息传递给函数是非常有用的。