通用方法中的自动高级kinded类型推断

时间:2018-02-22 15:08:53

标签: scala generics types type-inference higher-kinded-types

我用更高级的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子类的类型信息。

或者更确切地说,我不关心方法声明,但是每次调用它时,将一个“明显的”类型信息传递给函数是非常有用的。

0 个答案:

没有答案