什么是具体化?

2023-11-25

我知道Java通过擦除实现参数多态性(泛型)。我明白了什么是删除。

我知道 C# 通过具体化实现参数多态性。我知道这可以让你写作

public void dosomething(List<String> input) {}
public void dosomething(List<Int> input) {}

或者您可以在运行时知道某些参数化类型的类型参数是什么,但我不明白它是什么is.

  • 什么是具体化类型?
  • 什么是具体化价值?
  • 当类型/值具体化时会发生什么?

具体化是把抽象事物创造为具体事物的过程。

期限具体化在 C# 中,泛型是指一个过程泛型类型定义以及一个或多个泛型类型参数(抽象的东西)组合起来创造一个新的泛型(具体的事情)。

换句话说,这是获取定义的过程List<T> and int并生产混凝土List<int> type.

要进一步理解它,请比较以下方法:

  • 在 Java 泛型中,泛型类型定义本质上被转换为在所有允许的类型参数组合之间共享的一种具体泛型类型。因此,多种(源代码级别)类型被映射到一种(二进制级别)类型 - 但结果是,有关实例类型参数的信息在该实例中被丢弃(类型擦除).

    1. 作为这种实现技术的副作用,本机允许的唯一泛型类型参数是那些可以共享其具体类型的二进制代码的类型;这意味着那些存储位置具有可互换表示形式的类型;这意味着引用类型。使用值类型作为泛型类型参数需要将它们装箱(将它们放在一个简单的引用类型包装器中)。
    2. 为了以这种方式实现泛型,不需要重复任何代码。
    3. 在运行时(使用反射)可用的类型信息丢失了。反过来,这意味着泛型类型的专门化(使用专门化的能力)源代码对于任何特定的通用参数组合)是非常有限的。
    4. 该机制不需要运行时环境的支持。
    5. 有几个保留类型信息的解决方法Java 程序或基于 JVM 的语言可以使用。
  • 在 C# 泛型中,泛型类型定义在运行时维护在内存中。每当需要新的具体类型时,运行时环境就会组合泛型类型定义和类型参数并创建新类型(具体化)。所以我们为类型参数的每个组合得到一个新类型,在运行时.

    1. 这种实现技术允许实例化任何类型的类型参数组合。使用值类型作为泛型类型参数不会导致装箱,因为这些类型有自己的实现。 (拳击在 C# 中仍然存在,当然 - 但它发生在其他场景中,而不是这个场景。)
    2. 代码重复可能是一个问题 - 但实际上并不是,因为足够智能的实现(这包括 Microsoft .NET and Mono)可以共享某些实例化的代码。
    3. 通过使用反射检查类型参数,可以维护类型信息,从而在一定程度上允许专业化。然而,由于泛型类型定义是编译的,所以专业化程度是有限的before任何具体化都会发生(这是通过根据类型参数的约束编译定义- 因此,即使没有特定类型参数,编译器也必须能够“理解”定义).
    4. 这种实现技术在很大程度上依赖于运行时支持和 JIT 编译(这就是为什么您经常听到这样的说法)C# 泛型在 iOS 等平台上有一些限制,其中动态代码生成受到限制)。
    5. 在 C# 泛型的上下文中,具体化是由运行时环境为您完成的。但是,如果您想更直观地了解泛型类型定义和具体泛型类型之间的区别,你总是可以自己执行具体化,使用System.Type class(即使您正在实例化的特定泛型类型参数组合没有直接出现在源代码中)。
  • 在 C++ 模板中,模板定义在编译时保存在内存中。每当源代码中需要模板类型的新实例化时,编译器就会组合模板定义和模板参数并创建新类型。因此,我们为模板参数的每个组合获得一个唯一的类型,在编译时.

    1. 这种实现技术允许实例化任何类型的类型参数组合。
    2. 众所周知,这会重复二进制代码,但足够智能的工具链仍然可以检测到这一点并共享某些实例化的代码。
    3. 模板定义本身没有“编译” -实际上只编译它的具体实例。这对编译器的限制更少,并且允许更大程度的模板专业化.
    4. 由于模板实例化是在编译时执行的,因此这里也不需要运行时支持。
    5. 这个过程最近被称为单态化,尤其是在 Rust 社区。这个词是用来对比的参数多态性,这是泛型的概念名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是具体化? 的相关文章

随机推荐

  • 在内存限制的嵌入式系统中使用boost

    我们正在使用 C 开发一个在嵌入式系统上的 Windows CE 4 中运行的应用程序 我们的限制之一是应用程序使用的所有内存都应在仅启动 我们编写了许多仅使用预先分配的内存而不是分配新内存的容器和算法 您认为在这种情况下我们可以使用 bo
  • QListView 当列表为空时显示文本

    当 QListView 中没有项目时 我想显示一些文本 例如 没有项目 我尝试重写QListView的paintEvent方法 但没有任何效果 下面的代码展示了一种简单的方法 通过重载paintEvent视图的方法 文本的绘制可能应该使用样
  • jQuery 表单验证不起作用

    我花了几个小时在这上面 但我不知道为什么这个 jquery validate 不起作用 我最后把它分解到最低限度 但它仍然不起作用 这是实际的代码
  • 如何通过GA4测量协议识别用户所在国家

    可以通过 GA4 测量协议检索地理位置吗 我必须如何配置 json 正文来发送地理位置 例如通过 HitBuilder 我有同样的问题 并在下面的票证中询问谷歌 https issuetracker google com issues 23
  • .Net 和 iPhone 之间的 AES 互操作性?

    我需要加密 iPhone 上的字符串并将其发送到 Net Web 服务进行解密 我可以在 iPhone 上使用 Net 进行加密 解密 但来自 iPhone 的加密字符串无法通过 Net 解密 我收到的错误是 填充无效且无法删除 Net代码
  • 如何使用 PHP 连接 Dropzone.js 上传的分块文件?

    我使用 Dropzone js 获取各种类型的文件 包括图像和非图像 例如 PDF 并将它们以 1mb 块的形式上传到我们的服务器 然后 我尝试使用 PHP 连接这些文件 然后将它们上传到我们公司的 FileMaker 数据库 到目前为止
  • 在 github 操作上运行 firebase 模拟器

    我正在尝试在 Github Actinos 上运行测试 但经过多次尝试后我无法做到这一点 接收 错误 firestore Firestore 模拟器已退出 因为未安装 java 您可以从以下位置安装它https openjdk java n
  • PHP sendmail 在 Ubuntu 命令行中工作,但不能在 php 文件中工作

    我在 Ubuntu 上使用 PHP 和 apache 安装了 sendmail 当我尝试以下命令行时 php r mail email protected test test 它成功发送电子邮件 但是 运行文件 test send mail
  • 在 C# 客户端中为 gRPC 设置 keepalive

    我在 C 中使用 gRPC 客户端并使用长期存在的双工流 但是 TCP 连接有时会关闭 因此我想在客户端中使用 keepalive 服务器 用 Go 编写 已经针对 keepalive 进行了正确配置 并且已经使用 Go 编写的客户端进行了
  • 在设备上运行 OCUnit 应用程序测试套件时偶尔出现错误

    运行应用程序测试 即在设备上 时 我的 OCUnit 测试套件遇到一些问题 有时 我会收到一个棘手的错误 该错误似乎是从 OCUnit 类引发的 我一直在尝试查看添加到测试套件中的文件 但无法理解它 在设置测试目标时 我遵循了 Apple
  • JTextField,使用文档过滤器过滤整数和句点

    编辑 在帖子末尾添加我们能够实现的答案 这是我在 SO 的第一篇文章 所以我希望我能问好一切 尽管发布了类似的问题 但我进行了搜索 但没有找到我的问题的答案 所以我希望这不是重新发布 这就是我得到的 一个使用的小应用程序JTextField
  • 在SendComplete中处置SmtpClient?

    当我使用SmtpClient的SendAsync发送电子邮件时 如何处理smtpclient实例正确吗 比方说 MailMessage mail new System Net Mail MailMessage Body MailBody T
  • Python 中与 pandas 进行大型合并时出现 MemoryError

    我正在用 pandas 来做outer合并一组大约 1000 2000 个 CSV 文件 每个 CSV 文件都有一个标识符列id它在所有 CSV 文件之间共享 但每个文件都有一组唯一的 3 5 列列 大约有 20 000 个独特的id每个文
  • openpyxl 无法读取严格的 Open XML 电子表格格式:用户警告:文件包含 Sheet1 的无效规范。这将被删除

    我的一些用户 都使用 Mac 已将 Excel 上传到我的应用程序中 但应用程序拒绝了它 因为该文件似乎是空的 经过一些调试后 我确定该文件是以 Strict Open XML Spreedsheet 格式保存的 并且 openpyxl 2
  • 如何限制哪些国家/地区可以查看我的网站 ( PHP )

    在 PHP 中有一个简单的方法可以做到这一点 我想确保只有来自某些国家 地区的网络请求才能访问我的网站 有任何想法吗 使用 IP 地理定位数据库 有些是免费的 和 SERVER REMOTE ADDR 来获取访问者的 IP 地址 http
  • Numpy 中 Scipy 模式函数的替代方案?

    numpy 中是否有另一种方法来实现 scipy stats mode 函数以获取 ndarrays 中沿轴最频繁的值 无需导入其他模块 即 import numpy as np from scipy stats import mode a
  • onActivityResult 未在片段 android 中调用[重复]

    这个问题在这里已经有答案了 这是我从画廊拍照的代码 public class FragmentLayout1 extends Fragment implements OnClickListener View root Context c B
  • dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么

    我只是想知道当我们必须使用这些设置并获取驱动程序 API 时 可能的用例是什么 我所知道的是数据被保存了 稍后我们可以使用数据来做一些事情 我的问题是我们什么时候真的需要这样做 These exports can t be GPL due
  • 这是实现“记住我”功能的合理方法吗

    如果用户登录网站并说 记住我 我们会获取该用户的唯一标识符 使用 RijndaelManaged 对其进行加密 密钥大小为 256 并将其放置在 httponly cookie 中 设置有效期为 120 天 每次成功向服务器请求都会刷新过期
  • 什么是具体化?

    我知道Java通过擦除实现参数多态性 泛型 我明白了什么是删除 我知道 C 通过具体化实现参数多态性 我知道这可以让你写作 public void dosomething List