首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性状覆盖方法(Int => Int => Int)

性状覆盖方法(Int => Int => Int)
EN

Stack Overflow用户
提问于 2015-07-04 01:57:34
回答 3查看 72关注 0票数 1

鉴于以下特点:

代码语言:javascript
复制
scala> trait Foo { 
     |   def f: Int => Int => Int
     | }
defined trait Foo

我创建了一个尝试实例化Foo#f的类

代码语言:javascript
复制
scala> class FooImpl extends Foo {
     |  override def f(x: Int, y: Int) = 100
     | }
<console>:11: error: class FooImpl needs to be abstract, since method f in trait Foo of type => Int => (Int => Int) is not defined
       class FooImpl extends Foo {
             ^

我能够用以下方法解决这个问题:

代码语言:javascript
复制
scala> class FooImpl extends Foo {
     |   override def f = x => y => 100
     | }
defined class FooImpl

然后我可以做一个例子:

代码语言:javascript
复制
scala> new FooImpl().f(10)(20)
res3: Int = 100

但是,我如何创建一个Foo的实现,该实现使用def f(x: Int, y: Int) = 100实现Foo#f,即无需运行?

最后,我尝试:

代码语言:javascript
复制
scala> trait Bar { def f: (Int, Int) => Int }
defined trait Bar

但这也失败了:

代码语言:javascript
复制
scala> class BarImpl extends Bar { 
     |  override def f(x: Int, y:Int) =100
     | }
<console>:11: error: class BarImpl needs to be abstract, since method f in trait Bar of type => (Int, Int) => Int is not defined
       class BarImpl extends Bar {
             ^
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-04 02:21:51

这些类型是不相容的。

代码语言:javascript
复制
def f: Int => Int => Int

。。是一个无参数的方法,它返回带有一个参数Int的函数,返回带有一个参数Int的函数,返回Int

代码语言:javascript
复制
def f: (Int, Int) => Int

。。是一个无参数的方法,它返回带有Int类型的两个参数的函数,该参数返回Int

代码语言:javascript
复制
def f(x: Int, y: Int): Int

。。是一个具有两个Int参数的双参数方法,该方法返回一个Int

所有这些都是从根本上不同的。您不能用任何其他方法覆盖其中的任何一个。如果您想要f(x: Int, y: Int): Int,那么首先应该是Foo中的签名。否则,您将不得不咖喱,eta-展开,或其他东西,以使签名匹配。

票数 7
EN

Stack Overflow用户

发布于 2015-07-04 02:20:09

如果您想要该特性定义非咖喱版本,那么它需要如下所示:

代码语言:javascript
复制
trait Foo {
  def f(x: Int, y: Int): Int
}

这里的(x: Int, y: Int)表示f接受Int的两个参数,: Int表示返回值需要是Int

票数 0
EN

Stack Overflow用户

发布于 2016-04-13 10:12:49

这就是如何创建实现FooImpl特性的Foo。我们也可以访问Foo#f而无需运行。

代码语言:javascript
复制
trait Foo{
def f1:Int=> Int=> Int
def f2: (Int, Int) => Int
}

class FooImpl extends Foo{

    //actual implementors of f1 and f2 in Foo trait
    def g0=g1
    def g1=g2
    def g2=20
    def add(a:Int, b:Int)=a+b

    override  def f1=g0=>g1=>g2
    override def f2=add 
}

现在,我们可以实例化FooImpl类,而无需运行。

代码语言:javascript
复制
var x = new FooImpl
println(x.f1.apply(1).apply(1))  //results 20
println(x.f2(10,10))             //results 20
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31216143

复制
相关文章

相似问题

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