如何在scala中使用参数化返回类型的java泛型方法进行协变

时间:2017-11-20 14:05:37

标签: scala generics scala-java-interop

我试图在Scala中编写实现Google API Java客户端界面的凭据存储库:

import com.google.api.client.auth.oauth2.StoredCredential
import com.google.api.client.util.store.DataStore
import com.google.api.client.util.store.DataStoreFactory

class CredentialRepository extends DataStore[StoredCredential] {
  ... // Implementation
}

class CredentialDataStoreFactory extends DataStoreFactory {

  val store = new CredentialRepository

  def getDataStore[V <: Serializable](id: String): DataStore[V] = store

}

我收到此错误消息:

type mismatch; found : CredentialRepository required: com.google.api.client.util.store.DataStore[V]

如何使getDataStore协变,以便返回CredentialRepository?

1 个答案:

答案 0 :(得分:0)

为什么不:

def getDataStore(id: String): DataStore[StoredCredential] = store

这应该有用。

我觉得有一个通用的V对我来说没有意义,因为返回的类型是定义的而不是通用的。

编辑:

如果java接口需要这样的类型参数,你可以约束它:

def getDataStore[V <: StoredCredential with Serializable](id: String): DataStore[V] = store

或者

def getDataStore[V <: StoredCredential with Serializable](id: String): DataStore[StoredCredential] = store