【问题标题】:getting unimplemented methods error even though I have implemented them即使我已经实现了它们,也会出现未实现的方法错误
【发布时间】:2018-10-04 23:03:48
【问题描述】:

我的PlaySilhouetteCassandra 应用程序中出现以下错误

class UsersRepository needs to be abstract, since: it has 6 unimplemented members. /** As seen from class UsersRepository, the missing signatures are as follows. * For convenience, these are usable as stub implementations. */ // Members declared in com.mohiva.play.silhouette.api.repositories.AuthInfoRepository def add[T <: com.mohiva.play.silhouette.api.AuthInfo](loginInfo: com.mohiva.play.silhouette.api.LoginInfo,authInfo: T): scala.concurrent.Future[T] = ???

def find[T <: com.mohiva.play.silhouette.api.AuthInfo](loginInfo: com.mohiva.play.silhouette.api.LoginInfo)(implicit tag: scala.reflect.ClassTag[T]): scala.concurrent.Future[Option[T]] = ???

def remove[T <: com.mohiva.play.silhouette.api.AuthInfo](loginInfo: com.mohiva.play.silhouette.api.LoginInfo)(implicit tag: scala.reflect.ClassTag[T]): scala.concurrent.Future[Unit] = ???

def save[T <: com.mohiva.play.silhouette.api.AuthInfo](loginInfo: com.mohiva.play.silhouette.api.LoginInfo,authInfo: T): scala.concurrent.Future[T] = ???

def update[T <: com.mohiva.play.silhouette.api.AuthInfo](loginInfo: com.mohiva.play.silhouette.api.LoginInfo,authInfo: T): scala.concurrent.Future[T] = ???

但是,在同一个文件中,我已经实现了它们

class UsersRepository(session: Session) 
  extends CassandraRepository[UserKeys,User](session, "users", List("bucket","email")) with UserDao with AuthInfoRepository {

        def find(loginInfo:LoginInfo):Future[Option[PasswordInfo]] = Future {
    ...      }

          def add(loginInfo:LoginInfo, authInfo:PasswordInfo):Future[PasswordInfo] = Future {
       ...
          }

          def update(loginInfo:LoginInfo, authInfo:PasswordInfo):Future[PasswordInfo] = {
add(..)//add returns a Future
    ...}

          def save(loginInfo:LoginInfo, authInfo:PasswordInfo):Future[PasswordInfo] =  {
            add(..)//add returns a Future
}

          def remove(loginInfo:LoginInfo):Future[Unit] = Future{
    ...
          }
}

我做错了什么?

【问题讨论】:

  • 请发布完整代码,不要以代码格式发布错误

标签: scala playframework-2.6 silhouette


【解决方案1】:

好吧,你实际上并没有覆盖它们:

def add[T <: AuthInfo](
  loginInfo: LoginInfo,
  authInfo: T
): Future[T]

def add(
  loginInfo:LoginInfo,
  authInfo: PasswordInfo
):Future[PasswordInfo]

前者采用 anything 可以是 AuthInfo 的实例,后者是一个非常具体的情况,它恰好是 PasswordInfo

当您将 OOP 混入其中时,例如向上转换到父接口,特化可能实际上不可见,编译器将不得不使用通用(未实现)方法。

在这种情况下,添加 override 关键字会更安全,并确保您实际上覆盖了 ??? 实现。

【讨论】:

  • 谢谢。如果您的意思是我将def add(loginInfo:LoginInfo, authInfo:PasswordInfo):Future[PasswordInfo] 更改为override def add(loginInfo:LoginInfo, authInfo:PasswordInfo):Future[PasswordInfo],那么很遗憾这不起作用。另外,我可以在 IDE 中看到 method find overrides nothing 的消息
  • 这正是我的意思:您需要将您的签名更改为def add[T &lt;: AuthInfo]( loginInfo: LoginInfo, authInfo: T ): Future[T]。如果您只处理 PasswordInfo 情况,您可能会考虑在 trait/class 级别移动 [T],然后为特定的 T 实现此 trait。
  • 我认为您的回答是正确的,但我无法验证。 AuthInfoRepository 已经是一个特征。我正在UsersRepository 类中实现该特征,并且我想专门为PasswordInfo 实现它,因为findadd 方法使用特定于PasswordInfo 的字段。但我无法理解我怎么能做到这一点。由于新代码(您建议的代码)使用T 而不是PasswordInfo,我再也不能使用特定于PasswordInfo 的字段,因此出现编译错误。我如何“在特征/类级别上移动 [T],然后为特定 T 实现此特征”
  • 我接受您的回答,因为它回答我没有正确覆盖。我仍然面临的问题可能是设计问题,因此我打开了另一张票。请你看一下 - stackoverflow.com/questions/50014824/…
猜你喜欢
  • 2015-11-04
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2015-09-22
  • 2021-06-29
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多