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

键入func且接口参数不兼容错误

景理
2023-03-14
问题内容

我已经声明了一个新类型func,该新类型需要符合的任何值interface{}。但是,当我调用已作为参数传递的函数(符合该类型规范)时,会出现错误。

有人可以解释为什么会这样吗?以下是我可以重新创建问题的最简单示例。

type myfunc func(x interface{})

func a(num int) {
    return
}

func b(f myfunc) {
    f(2)
    return
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
    return
}

问题答案:

您在这里寻找的概念是类型系统中的
差异

。某些类型的系统和类型支持 协方差逆变 ,但围棋的接口不。

虽然int可以将an
传递给Expect的函数interface{},但关于func(int)和不能说相同func(interface{}),因为接口的行为不协变。

如果type x实现接口ii,则并不意味着func(x)实现func(ii)

您可以做的是传递给func(int)Expect的函数interface{},因此您可以做

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}

由于func(int)int 没有 实现interface{}

除了答案顶部的Wikipedia链接之外,此文章还提供了有关各种差异编程语言支持的更多详细信息。它主要使用其他语言,因为方差最好用支持继承的语言来证明。



 类似资料:
  • 问题内容: 我正在尝试建立一个实现和的类。这两个接口都定义了方法,但是返回类型不同: K的类型擦除导致这两个方法签名冲突。我不能拥有它们中的一个,因为它是一个无效的覆盖,并且我不能拥有两个,因为它们具有相同的签名。有什么方法可以使这两个接口共存? 问题答案: 我认为在这种特殊情况下是不可能的。如果两个类都返回了对象类型,那么您将有机会,但是由于您混合了基本类型和对象类型,因此没有兼容的类型同时支持

  • 我定义了这个类: 在其他地方,在具有此签名的函数中: 我尝试返回新的ActorMapper(),但javac抱怨: 我可以投射它,它工作得很好,但为什么不能编译呢。有人能帮我吗?:)

  • 问题内容: 我已经尝试了本文和Cassandra doc中的 所有措施。 我已经尝试运行所有版本的Cassandra,包括tarball和Debian软件包中的最新版本3.7,但是执行时总是出错。 错误: 连接错误:(“无法连接到任何服务器”,{‘127.0.0.1’:TypeError(’ref()不带有关键字参数’,)}) 我将Linux Mint从17.3升级到18之前,运行Cassandr

  • 问题内容: 我在kotlin上开发应用程序,但需要良好的Java支持。我发现的问题是kotlin的功能。 这是我以前做的 但这会从kotlin库编译为Function1,并且由于jar的大小,我没有在jar中直接包含kotlin库,这使Java开发人员更加困难,因为他们必须下载kotlin库才能使用此功能方法。 我尝试使用Java的Supplier或Function接口,但发现Kotlin开发人员

  • 问题内容: 当我尝试编译时,它给了我错误 我应该如何解决这个问题? 问题答案: 该错误是由于以下事实导致的:调用将是不明确的- 应该调用两种方法中的哪一种?从JLS§8.4.2开始: 在类中声明两个具有重写等效签名的方法是编译时错误。 方法的返回类型不是其签名的一部分,因此根据上述说明,您将收到错误。 假设您不能简单地重命名冲突的方法,在这种情况下就不能使用继承,并且需要使用诸如compositi

  • 我一直试图编译这个简单的警报对话框,以便在用户单击提交按钮时显示。编译代码时会弹出一条错误消息: 错误:(33,74)错误:不兼容的类型: 这个类叫做Login_Activity,它扩展了BaseActivity,它扩展了Activity。