目录
问题内容
解决方法
首页 后端开发 Golang 无法推断函数构造函数的泛型参数中的类型

无法推断函数构造函数的泛型参数中的类型

Feb 09, 2024 am 08:00 AM
编译错误

无法推断函数构造函数的泛型参数中的类型

php小编柚子将为大家解答一个常见的问题:在构造函数的泛型参数中,无法推断出类型的原因。在PHP中,泛型参数的类型推断是通过参数的默认值来实现的。然而,在构造函数中,由于参数是在对象创建之前就被传入的,因此无法通过对象的实例来推断参数的类型。这就导致了构造函数中无法推断出泛型参数的类型,需要手动指定类型来解决这个问题。

问题内容

我在 go 中有一些通用代码,其中有一个具有通用参数的“主”类型和许多应该共享相同通用参数的“从”类型。代码看起来与此类似:

type Doer[T any] interface {
    ModifyA(*A[T])
}

type B[T any] struct {
}

func NewB[T any]() *B[T] {
    return new(B[T])
}

func (b *B[T]) ModifyA(a *A[T]) {
    // Do a thing
}

type A[T any] struct{}

func NewA[T any]() A[T] {
    return A[T]{}
}

func (a *A[T]) Run(doers ...Doer[T]) {
    for _, doer := range doers {
        doer.ModifyA(a)
    }
}

func main() {
    a := new(A[int])
    a.Run(NewB())   // error here
}
登录后复制

基本上,用户应该在 a 上定义 t ,然后 b 上的 t 应该是相同的。此类代码可以在支持泛型的其他语言中工作,但在 go 中,我在注释行处收到 cannot infer t 编译错误(请参阅此处的 go playground 代码)。在我看来, a 上的类型参数设置为 int ,因此 b 上的类型参数也应设置为 int 。我可以改为调用 newb[int]() ,但这对我来说似乎过于冗长。为什么会出现这种情况?

解决方法

这是“为什么编译器不能根据返回类型的使用方式推断类型参数?”的变体。答案:因为从 go 1.20 开始,这不是类型推断的工作方式。

类型推断适用于:

  • 类型参数列表
  • 使用已知类型参数初始化的替换映射 m(如果有)
  • 普通函数参数的(可能为空)列表(仅在函数调用的情况下)

如果您一一检查这些规则:

  • newb() 有类型参数列表吗?不。您在调用它时没有指定类型参数。

  • 是否有其他已知的类型参数可以用来推断其他类型参数?不,您根本没有提供任何类型参数。请注意,这种情况适用于您提供部分数量的类型参数的函数调用,例如:

    func foo[T any, U *T]() {}
    登录后复制

    在上面您只能提供 t,例如float64,编译器将使用 t -> float64 构造替换映射,然后推断 u -> *float64

  • 最后,有普通函数参数的列表吗?否。newb 为空。

  • 仅此而已。编译器不会根据函数返回类型的使用方式推断类型参数。

    在撰写本文时,正在讨论的相关提案有:

    以上是无法推断函数构造函数的泛型参数中的类型的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C++ 函数继承详解:如何在继承中使用'基类指针”和'派生类指针”? C++ 函数继承详解:如何在继承中使用'基类指针”和'派生类指针”? May 01, 2024 pm 10:27 PM

在函数继承中,使用“基类指针”和“派生类指针”来理解继承机制:基类指针指向派生类对象时,执行向上转型,只访问基类成员。派生类指针指向基类对象时,执行向下转型(不安全),必须谨慎使用。

sublime运行python代码按哪个键 sublime运行python代码按哪个键 Apr 03, 2024 pm 03:54 PM

在 Sublime Text 中运行 Python 代码的快捷键为:Windows 和 Linux: Ctrl + BMac: Cmd + B将光标放置在代码中。按下快捷键。代码将使用系统默认的 Python 解释器运行。

notepad++如何运行C语言 notepad++如何运行C语言 Apr 08, 2024 am 10:06 AM

Notepad++ 本身不能运行 C 语言程序,需要一个外部编译器来编译和执行代码。为了使用外部编译器,可以按以下步骤进行设置:1. 下载并安装 C 语言编译器;2. 在 Notepad++ 中创建自定义工具,将编译器可执行文件路径和参数配置好;3. 创建 C 语言程序并保存为 .c 文件扩展名;4. 选择 C 语言程序文件,从“运行”菜单中选择自定义工具进行编译;5. 查看编译结果,输出编译错误或成功消息。如果编译成功,将生成可执行文件。

java中val是什么意思 java中val是什么意思 Apr 25, 2024 pm 10:06 PM

Java 中的 val 关键字用于声明不可变的局部变量,即一旦赋值后无法更改其值。特点有:不可变性:一旦初始化,val 变量不能重新赋值。局部作用域:val 变量仅在声明它们的代码块内可见。类型推断:Java 编译器会根据赋值的表达式推断 val 变量的类型。仅限局部变量:val 只能用于声明局部变量,不能用于类字段或方法参数。

java中=是什么意思 java中=是什么意思 Apr 26, 2024 pm 11:30 PM

Java 编程语言中的 "=" 操作符用于给变量赋值,将表达式右侧的值存储在左侧变量中。用法:变量 = 表达式,其中变量是接收赋值的变量名称,表达式是计算或返回值的代码段。

c++中const和static的区别 c++中const和static的区别 May 01, 2024 am 10:54 AM

const 修饰符表示常量,值不可修改;static 修饰符指示变量的生存期和作用域。const 修饰的数据成员在初始化后不可修改,static 修饰的变量在程序启动时初始化,在程序结束时销毁,即使没有活动对象也会存在,并且可以跨函数访问。const 修饰局部变量必须声明时初始化,static 修饰的局部变量可以稍后初始化。const 修饰类成员变量必须在构造函数或初始化列表中初始化,static 修饰的类成员变量可以在类外部初始化。

如何在 Java 泛型方法中限制类型参数? 如何在 Java 泛型方法中限制类型参数? Apr 30, 2024 pm 01:30 PM

为了在Java泛型方法中限制类型参数,需使用语法,其中Bound为类型或接口。如此,参数仅接受继承自Bound类型或实现Bound接口的类型。例如,限制T为可与自身比较的类型。

Java 函数重载机制中编译器如何区分具有相同样式但类型不同的参数? Java 函数重载机制中编译器如何区分具有相同样式但类型不同的参数? Apr 25, 2024 am 10:03 AM

编译器区分重载函数的方法:通过签名,即每个函数参数的类型。即使函数名称和参数数量相同,只要参数类型不同,编译器就能区分开来。

See all articles