首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能调用在新特性时定义的应用函数

不能调用在新特性时定义的应用函数
EN

Stack Overflow用户
提问于 2014-06-14 10:30:47
回答 2查看 144关注 0票数 0
代码语言:javascript
复制
object test {
  trait Test {
    def apply() = {
      println("calling apply in trait test")
      this
    }
  }
  object Test {
    def apply(f: Int => String): Test = {
      println("calling apply in object Test")
      new Test {
        println("test123")
        def apply(a: Int) = f(a)  // this apply function should be available when call Test(f)?
      }
    }
  }
  def fun(a:Int)=a.toString
  val f=fun _
  val a=Test(f)
  a()
  a(1) // why this failed? a is created by calling Test(f) which is actually 
       //calling apply function of object Test, and that function return a Test
       //with an addition function of apply(a:Int). And a(1) is actually calling 
       //apply(1), but why it doesn't compile? 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-14 12:18:31

您的签名:

代码语言:javascript
复制
def apply(f: Int => String): Test = { … }

将结果限制为被视为Test特性,这不包括新的apply。通过省略结果类型,返回的对象将是一个Test+apply,它将执行您希望它做的事情:

代码语言:javascript
复制
def apply(f: Int => String) = { … }
票数 4
EN

Stack Overflow用户

发布于 2014-06-14 10:41:07

这一失败的原因是您的类型Test是用一个接受空参数列表的apply方法定义的。使用new Test { ... },您可以创建Test的匿名子类。虽然使用接受apply参数的另一个版本重载Int,但对象的apply方法的返回类型只是Test。所以从外部看,这个重载的方法是不可见的。

为了说明你的问题:

代码语言:javascript
复制
trait Foo

def mkFoo(): Foo = new Foo { def bar = 1234 }

val f = mkFoo()
f.bar  // we don't know anything about bar

只需定义您的特性Test,以包含另一个apply方法:

代码语言:javascript
复制
trait Test {
  def apply() = {
    println("calling apply in trait test")
    this
  }

  def apply(i: Int): String  // abstract
}

编辑:作为一个完整的问题,如果您使用@samuel的答案中所示的“精化”返回类型,从技术上讲,您使用的是一种“结构化类型”,它附带了一些性能缺陷,因为该方法将使用运行时反射来调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24218982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档