如何为泛型Test结构体实现仅返回Test<f32>的new方法?
解决方案
你当前的问题出在泛型impl块上:impl<T> Test<T>意味着这个块里的方法对所有Test<T>实例(不管T是什么类型)都生效,所以即使你用turbofish指定i16,编译器也会匹配到这个泛型impl,允许调用new,但返回值却是固定的Test<f32>,这显然不符合设计意图。
要实现「仅返回Test<f32>且不允许指定其他类型调用」,只需要把new函数放在针对Test<f32>的专属impl块里,而不是泛型impl块:
use std::path::Path; fn main() { #[derive(Debug)] struct Test<T> { field: T } // 仅针对Test<f32>实现new方法 impl Test<f32> { fn new() -> Test<f32> { Test { field: 3_f32 } } } // 正常调用,无需指定类型 let b = Test::new(); println!("{:?}", b); // 下面这行代码会编译报错,因为Test<i16>没有实现new方法 // let c = Test::<i16>::new(); }
为什么这样有效?
- 专属impl块
impl Test<f32>只对Test<f32>类型生效,其他类型的Test<T>(比如Test<i16>、Test<String>)不会继承这个new方法。 - 调用
Test::new()时,编译器会自动推断出目标类型是Test<f32>,不需要额外指定;如果强行用turbofish指定其他类型,编译器会提示该类型没有new方法,直接阻止非法调用。
如果你的业务场景中,Test<T>还需要其他泛型方法,可以保留泛型impl块,把new单独放在专属impl里就行,两者互不冲突:
impl<T> Test<T> { // 其他泛型方法,比如获取field fn get_field(&self) -> &T { &self.field } } impl Test<f32> { fn new() -> Test<f32> { Test { field: 3_f32 } } }
内容的提问来源于stack exchange,提问作者daniellga
相关产品推荐
相关产品推荐

