【问题标题】:why can't I pass companion object to a function为什么我不能将伴随对象传递给函数
【发布时间】:2018-09-12 09:00:55
【问题描述】:

我正在研究 Silhouette 框架,并正在创建一个 Environment 类型的变量。它的伴生对象有签名

def apply[E <: Env](
  identityServiceImpl: IdentityService[E#I],
  authenticatorServiceImpl: AuthenticatorService[E#A],
  requestProvidersImpl: Seq[RequestProvider],
  eventBusImpl: EventBus

对于authenticatorServiceImpl参数,我认为我可以传递伴随对象SessionAuthenticatorService(定义在https://github.com/mohiva/play-silhouette/blob/master/silhouette/app/com/mohiva/play/silhouette/impl/authenticators/SessionAuthenticator.scala)但是当我尝试时:

val sessionEnv = com.mohiva.play.silhouette.api.Environment[SessionEnv](new UserService(userRepository),SessionAuthenticatorService() ,CredentialsProvider(),EventBus())

我得到了错误

com.mohiva.play.silhouette.impl.authenticators.SessionAuthenticatorService.typ 不带参数。

我删除了(),但又出现了一个错误:

发现:SessionAuthenticatorService.type [error] required: AuthenticatorService[components.SessionEnv#A]

看来我的概念不正确。为什么我不能通过SessionAuthenticatorService

【问题讨论】:

  • 所以我不熟悉这些框架中的任何一个,但通常是关于伴随对象的一个​​词。您可以将它们视为静态类成员(例如 java 中带有 static 关键字的字段和方法),因此包含这些成员的对象实际上不是该特定类的类型。例如。你有一些类 Foo 该类的伴生对象 Foo 不是 Foo 类型,但有它自己的(主要是不相关的类型)
  • 谢谢多米尼克。你的回答也是正确的

标签: scala silhouette


【解决方案1】:

伴随对象不是伴随类的实例。它实际上是一种不同的类型。

class ABC(val arg: Int)
object ABC

val abc: ABC      = new ABC(9)
val xyz: ABC.type = ABC

abc.arg  //res0: Int = 9
xyz.arg  //Error: value arg is not a member of object A$A1661.this.ABC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多