当前位置: 首页 > 面试题库 >

为什么方法签名必须与接口方法完全匹配

支嘉祥
2023-03-14
问题内容

我开始学习Go,但对以下内容有所了解:

package main

import "fmt"

type I interface {
    foo(interface {})
}

type S struct {}

func (s S) foo(i int) {
    fmt.Println(i)
}

func main() {
    var i I = S{}
    i.foo(2)
}

失败的原因是:

cannot use S literal (type S) as type I in assignment:
        S does not implement I (wrong type for foo method)
                have foo(int)
                want foo(interface {})

foo(int)考虑到int实现的事实,我不明白为什么Go不接受签名interface {}。有人可以帮忙解释吗?


问题答案:

我认为您对界面的理解不够充分。Interface {}本身就是一种类型。它由两部分组成:基础类型和基础值。

Golang没有重载。Golang类型系统按名称匹配,并且要求类型一致

因此,当您定义将接口类型作为参数的函数时:

foo(interface {})

这与采用int类型的函数不同:

foo(int)

因此,您应该将以下行更改为

func (s S) foo(i interface{}) {
    fmt.Println(i)
}

或对此更好:

type I interface {
    foo()
}

type S struct {
    I int
}

func (s S) foo() {
    fmt.Println(s.I)
}

func main() {
    var i I = S{2}
    i.foo()
}


 类似资料:
  • 下面是一个简单的例子,展示了我的问题: 在中,我提供了方法和的实现,这是来自的唯一抽象方法。但是,当我编译时,我仍然会遇到以下错误: 类型MyWork必须实现继承的抽象方法AbstractCollection.size() 或者 我的任务。java:3:错误:MyTask不是抽象的,并且不重写AbstractList中的抽象方法get(int) (取决于编译器)。当然,我使用的是java 8。 所

  • 有没有办法在接口中指明可选方法(以便合同只指明要给出的参数的数量/类型)? 请对这个问题给予更多的理解和见解,并指出一个解决方案?例如,参见这个讨论:Java界面中的可选方法 在应用程序中,我使用连接到持久性(原则)的侦听器。所以我使用了以下几种方法: 等等。 现在,在重构时,由于有太多的实体(要持久化的对象),我决定将这些方法的部分拆分成单独的类。 然而,并不是所有人都需要所有的预。。。和后。。

  • 学习Java8默认方法。这个链接就像互联网上的其他资源一样说 在“最严格的意义上”,默认方法是一种倒退,因为它们允许你用代码“污染”你的接口。但它们提供了允许向后兼容的最优雅和最实用的方法。它使Oracle更容易更新所有集合类,也使您更容易为Lambda修改现有代码。 我的理解是Java8Dev/Designers在接口中提供了默认方法,这样所有实现类就不必不必要地重写相同的行为,从而提供了向后兼

  • 问题内容: 有时我们有几个类,这些类的某些方法具有相同的签名,但是与声明的Java接口不对应。例如,和(在中的其他几个 )中都有一个方法 现在,假设我希望对具有该方法的对象进行一些操作。然后,我想有一个接口(或者自己定义),例如 这样我可以写: 但是,可悲的是,我不能: 此演员表将是非法的。编译器 知道 这 是不是 一个,因为类没有宣布实现该接口...... 然而“实际上”实现它 。 有时这会带来

  • 本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha

  • 在上面的代码中,为什么在< code>main()中强制提到< code>String args[]以及为什么我们得到< code > "[ljava . lang . String;@174e5edb"作为输出?