Geek_de05b4
2023-11-03
来自上海
impl<T: std::ops::Add<Output = T>> Bar<T> { fn plus(self, other: Bar<T>) -> T { self.value + other.value } } impl Bar<u32> { fn plus(&self, other: &Bar<u32>) -> u32 { self.value + other.value } } //Output: error[E0592]: duplicate definitions with name `plus` --> src/main.rs:64:5 | 64 | fn plus(self, other: Bar<T>) -> T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ duplicate definitions for `plus` ... 70 | fn plus(&self, other: &Bar<u32>) -> u32 { | --------------------------------------- other definition for `plus` 不能
作者回复: 👍
1
小云同学
2023-11-03
来自中国台湾
思考题:"为泛型实现了一个方法,能否再为具化类型实现一个同名方法",取决于这个泛型能否表示相应的具化类型。比如为泛型 T 和 String 实现了相同的方法,由于 T 没有施加任何约束,它可以代表 String。那么当调用方法时,对于具化类型 String 来说,要调用哪一个呢?因此会出现歧义,编译器会报错:方法被重复定义了。 但如果给泛型 T 施加了一个 Copy 约束,要求 T 必须实现了 Copy trait,那么就不会报错了,因为此时 T 代表不了 String,所以调用方法不会出现歧义。但如果再为 i32 实现一个同名方法就会报错了,因为 i32 实现了 Copy,它可以被 T 表示。 PS:老师我在 06 讲提了一个问题,之前在学 Rust 的时候就一直困扰着我,还麻烦老师解答一下。
作者回复: 👍
一个人旅行
2023-11-03
来自北京
不能,编译器会提示duplicate definitions for XXXXX。 如果想为具化类型再实现同样的方法,则可以定义一个trait,用具化类型实现这个trait,来达到"为具化类型再实现同样的方法“的目的。
作者回复: 👍
伯阳
2023-11-03
来自北京
和Java的范型类似
1