Rust(比如Java)中是否存在泛型擦除?我找不到确切的答案.

推荐答案

当您使用泛型函数或泛型类型时,编译器会 for each 不同的类型参数集生成一个单独的实例(我认为生命周期参数会被忽略,因为它们对生成的代码没有影响).这个过程叫做monomorphization.例如,Vec<i32>Vec<String>是不同的类型,因此Vec<i32>::len()Vec<String>::len()是不同的功能.这是必要的,因为Vec<i32>Vec<String>有不同的内存布局,因此需要不同的机器代码!因此,no不存在类型擦除.

如果我们使用Any::type_id(),如下例所示:

use std::any::Any;

fn main() {
    let v1: Vec<i32> = Vec::new();
    let v2: Vec<String> = Vec::new();
    
    let a1 = &v1 as &dyn Any;
    let a2 = &v2 as &dyn Any;
    
    println!("{:?}", a1.type_id());
    println!("{:?}", a2.type_id());
}

我们为Vec的两个实例获取不同类型的ID.这支持了Vec<i32>Vec<String>是不同类型的事实.

然而, rust 迹中的反射能力有限;Any差不多是我们现在的全部了.无法获取有关运行时值类型的详细信息,例如其名称或成员.为了能够使用Any,必须将它(使用Any::downcast_ref()Any::downcast_mut())强制转换为编译时已知的类型.

Rust相关问答推荐

如何定义使用拥有的字符串并返回拥有的Split的Rust函数?

有条件默认实现

如何访问Rust存储值的内存地址

为什么BitVec缺少Serialize trait?

通过使用光标拖动角来绕其中心旋转矩形

使用Clap时如何将String作为Into Str参数传递?

闭包不会发送,即使它只捕获发送变量

为什么BufReader实际上没有缓冲短寻道?

从 rust 函数返回 &HashMap

如何正确使用git2::Remote::push?

当锁被释放时,将锁包装到作用域中是否会发生变化?

闭包返回类型的生命周期规范

Rust 中的自动取消引用是如何工作的?

由特征键控的不同 struct 的集合

如何连接 Rust 中的相邻切片

切片不能被 `usize` 索引?

Rust 中 `Option` 的内存开销不是常量

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

在 Rust 中退出进程

为什么当borrow 变量发生变化时,borrow 变量不会改变?