使用Rust的specialization特化特性时报错,我哪里写错了?
问题原因
- 该错误是Rust特化特性的现有设计限制导致:默认关联类型的声明不会在默认实现的方法中自动建立类型等价关系。编译器处理泛型默认实现的
new方法时,只会将<MyStruct<T> as Data>::Data识别为独立的关联类型,不会直接等同于你定义的默认类型u64——因为存在其他更具体的特化实现覆盖该关联类型的可能性,当前编译器不会做这种假设。
修复方案
只需要在默认实现的构造逻辑中增加一次显式类型转换,明确告知编译器赋值的类型符合当前实现的关联类型约定即可,修改后的可运行代码如下:
#![allow(incomplete_features)] #![feature(specialization)] pub trait Data { type Data; fn new() -> Self; } pub struct MyStruct<T> { pub data: <Self as Data>::Data, } // 默认实现 impl<T> Data for MyStruct<T> { default type Data = u64; default fn new() -> Self { // 显式转换为当前实现的关联类型,也可以简化写为 1 as Self::Data MyStruct::<T> { data: 1u64 as <Self as Data>::Data } } } // 特化实现 impl Data for MyStruct<i64> { type Data = u32; fn new() -> Self { MyStruct::<i64> { data: 1u32 } } }
修改后代码完全保留了你需要的特性:未特化的MyStruct<T>实例data字段为u64类型,特化的MyStruct<i64>实例data字段为u32类型。
内容的提问来源于stack exchange,提问作者wyoumans
相关产品推荐
相关产品推荐

