Nano Hash - криптовалюты, майнинг, программирование

Ошибка переопределения Scala

Я использую Play framework 2.2.x и SecureSocial, и для тестирования я пытаюсь переопределить метод в суперклассе. На самом деле я получаю сообщение об ошибке компиляции, используя тестовые вспомогательные классы из безопасных социальных сетей, и я не могу понять это, так как я не очень хорошо знаком со Scala.

Чего я не понимаю, так это почему в моем ide метод правильно переопределен, но когда я компилирую, я получаю сообщение об ошибке. Я знаю, что scala не так хорошо интегрирована с IDE, но я не понимаю, почему переопределение неверно.

/**
 *  This is the secure social class and method I am trying to override. 
    I have left the other methods out for clarity. The problem method is the doAuth method
 **/

пакет securesocial.core

import providers.utils.RoutesHelper
import play.api.mvc.{SimpleResult, AnyContent, Request}
import play.api.{Play, Application, Plugin}
import concurrent.{Await, Future}
import play.api.libs.ws.Response

abstract class IdentityProvider(application: Application) extends Plugin with Registrable {
 /**
   * Subclasses need to implement the authentication logic. This method needs to return
   * a User object that then gets passed to the fillProfile method
   *
   * @param request
   * @return Either a Result or a User
   * This is the method I am having trouble trying to override
   */
  def doAuth()(implicit request: Request[AnyContent]):Either[SimpleResult, SocialUser]
}

Это мой класс и набор тестов пакета переопределения doAuth().

import play.api.Logger
import securesocial.core._
import play.api.mvc.{Result, Request}
import securesocial.core.IdentityId

class AlwaysValidIdentityProvider(app:play.api.Application) extends IdentityProvider(app){
  val logger = Logger("securesocial.stubs.AlwaysValidIdentityProvider")
  def authMethod: AuthenticationMethod = AuthenticationMethod("naive")


  override def doAuth()(implicit request: Request[play.api.mvc.AnyContent]): Either[Result, SocialUser] ={
    val userId = request.body.toString
    val r =Right(SocialUserGenerator.socialUserGen(IdentityId(userId, id), authMethod).sample.get)
    r
  }


  def fillProfile(user: SocialUser): SocialUser = {
    user
  }

  def id: String = "naive"
}

Ошибка, которую я получаю: как вы можете видеть, она думает, что я ничего не переопределяю.

[error] /Users/zola/Development/play/receipt-manager/rm-play/test/testkit/AlwaysValidIdentityProvider.scala:8: class AlwaysValidIdentityProvider needs to be abstract, since method doAuth in class IdentityProvider of type [A]()(implicit request: play.api.mvc.Request[A])Either[play.api.mvc.Result,securesocial.core.SocialUser] is not defined
[error] class AlwaysValidIdentityProvider(app:play.api.Application) extends IdentityProvider(app){
[error]       ^
[error] /Users/zola/Development/play/receipt-manager/rm-play/test/testkit/AlwaysValidIdentityProvider.scala:13: method doAuth overrides nothing.
[error] Note: the super classes of class AlwaysValidIdentityProvider contain the following, non final members named doAuth:
[error] def doAuth[A]()(implicit request: play.api.mvc.Request[A]): Either[play.api.mvc.Result,securesocial.core.SocialUser]
[error]   override def doAuth()(implicit request: Request[play.api.mvc.AnyContent]): Either[Result, SocialUser] ={
[error]                ^
[error] two errors found

  • Не потому ли, что возвращаемые типы разные? Например. Result и SimpleResult. 03.06.2014

Ответы:


1

Это потому, что метод, который вы переопределяете, еще не определен. У вас есть подпись в абстрактном классе и все.

Попробуйте это вместо этого:

def doAuth()(implicit request: Request[play.api.mvc.AnyContent]): Either[Result, SocialUser] ={
    val userId = request.body.toString
    val r =Right(SocialUserGenerator.socialUserGen(IdentityId(userId, id), authMethod).sample.get)
    r
}
03.06.2014
  • Таким образом, тот, что в абстрактном классе, не находится под моим контролем, он принадлежит структуре SecureSocial, поэтому я не могу его изменить. 03.06.2014
  • На самом деле тот, что находится в абстрактном классе, — это просто сигнатура, показывающая аргументы и возвращаемый тип. В основном, наследуя от абстрактного класса, вы должны предоставить свою собственную реализацию. Позже вы можете создать экземпляр объекта вашего класса, который будет использовать вашу реализацию. Переопределение используется, когда у вас уже есть реализация, определенная в родительском абстрактном классе. 03.06.2014
  • Спасибо, Питер, я полностью понимаю концепцию переопределения. Я просто не понимаю, почему возникает ошибка, когда я пытаюсь переопределить это. Таким образом, даже с вашим предложением я получаю сообщение об ошибке в ide, говорящее, что он не переопределяет метод суперкласса, и если я автоматически реализую его в ide, все в порядке в ide, но когда я компилирую, я получаю вышеуказанную ошибку. 03.06.2014

  • 2

    Чтобы решить эту проблему, я посмотрел на другие классы в SecureSocial, и они реализовали метод так:

        def doAuth[A]()(implicit request: Request[A]): Either[Result, SocialUser] = {
         val userId = request.body.toString
         val r =Right(SocialUserGenerator.socialUserGen(IdentityId(userId, id), authMethod).sample.get)
         r
     }
    
    03.06.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..