我已经声明了一个新类型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
我试图运行一个简单的迁移,我得到了这个错误。我想是某种兼容性错误。如何修复它,如何避免将来出现兼容性问题?