我知道Java通过擦除实现了参数多态性(泛型)。我明白什么是擦除。
我知道 C# 通过具体化实现了参数多态性。我知道这可以让你写作
public void dosomething(List<String> input) {} public void dosomething(List<Int> input) {}
或者您可以在运行时知道某些参数化类型的类型参数是什么,但我不明白它 是 什么。
物化是一个抽象的东西和创造一个具体的东西的过程。
C# 泛型中的术语 具体化 是指将_泛型类型定义_ 和一个或多个 泛型类型参数 (抽象事物)组合以创建新 泛型类型 (具体事物)的过程。
换一种说法,它是定义List<T>并int产生具体List<int>类型的过程。
List<T>
int
List<int>
要进一步理解它,请比较以下方法:
在 Java 泛型中,泛型类型定义本质上被转换为一种在所有允许的类型参数组合中共享的具体泛型类型。因此,多个(源代码级别)类型被映射到一个(二进制级别)类型 - 但结果,有关实例类型参数的信息在该实例中被丢弃(类型擦除)。
在 C# 泛型中,泛型类型定义在运行时保存在内存中。每当需要一个新的具体类型时,运行时环境就会结合泛型类型定义和类型参数并创建新类型(具体化)。 因此,我们在运行时 为类型参数的每个组合获得了一个新类型。
这种实现技术允许实例化任何类型的类型参数组合。使用值类型作为泛型类型参数不会导致装箱,因为这些类型有自己的实现。
System.Type
在 C++ 模板中,模板定义在编译时保存在内存中。每当源代码中需要模板类型的新实例时,编译器就会结合模板定义和模板参数并创建新类型。 所以我们在编译时 为模板参数的每个组合获得了一个唯一的类型。
这种实现技术允许实例化任何类型的类型参数组合。