Rust中两次实现impl<T> From<T> for B为何出现trait冲突?
为何两个
From<T>实现会为B类型产生冲突? 问题代码
struct A {} struct B {} struct C {} impl<T> From<T> for B where T: AsRef<A>, { fn from(_: T) -> Self { todo!() } } impl<T> From<T> for B where T: AsRef<C>, { fn from(_: T) -> Self { todo!() } }
错误信息
error[E0119]: conflicting implementations of trait `std::convert::From<_>` for type `B` --> src/main.rs:59:1 | 50 | impl<T> From<T> for B | --------------------- first implementation here ... 59 | impl<T> From<T> for B | ^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `B`
原因解释
Rust的 trait 实现必须保证无歧义,这里的冲突根源在于:存在潜在的类型T可以同时满足AsRef<A>和AsRef<C>两个约束,导致编译器无法确定该选用哪个From<T>实现。
比如我们可以定义一个同时实现这两个 trait 的类型:
struct D {} impl AsRef<A> for D { fn as_ref(&self) -> &A { &A {} } } impl AsRef<C> for D { fn as_ref(&self) -> &C { &C {} } }
当尝试将D转换为B时,两个From<T>实现都会匹配,编译器无法做出唯一选择。
哪怕你当前没有定义这样的T,Rust编译器也会假设这种可能性存在——因为 trait 实现的有效性是全局的,不能依赖当前代码中是否存在具体类型。为了避免后续出现歧义,编译器会直接判定这两个实现冲突。
内容的提问来源于stack exchange,提问作者Anon21
相关产品推荐
相关产品推荐

