我们有两个特征A和B,其中:
1. 我可以轻松地为实现A的所有类型实现B。 2. 我可以轻松地为任何实现A的类型的引用实现A。 3. 我可以轻松地为任何实现B的类型的引用实现B。
事实上,执行这三个操作会导致冲突,因为现在实现A的类型的引用将具有两个实现B的实现。一种是由于impl<T: A> A for &T,另一种是由于transitively impl<T: A> B for T(然后是impl<T: B> B for &T)。
我不能删除impl<T: B> B for &T,因为可能会有实现B而不是A的类型。
以下是展示行为的示例代码:
这会导致以下错误:
1. 我可以轻松地为实现A的所有类型实现B。 2. 我可以轻松地为任何实现A的类型的引用实现A。 3. 我可以轻松地为任何实现B的类型的引用实现B。
事实上,执行这三个操作会导致冲突,因为现在实现A的类型的引用将具有两个实现B的实现。一种是由于impl<T: A> A for &T,另一种是由于transitively impl<T: A> B for T(然后是impl<T: B> B for &T)。
我不能删除impl<T: B> B for &T,因为可能会有实现B而不是A的类型。
以下是展示行为的示例代码:
trait A {}
trait B {}
impl<'a, T: A> A for &'a T {}
impl<T: A> B for T {}
impl<'a, T: B> B for &'a T {}
这会导致以下错误:
error[E0119]: conflicting implementations of trait `B` for type `&_`:
|
| impl<T: A> B for T {}
| --------------------- first implementation here
| impl<'a, T: B> B for &'a T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
是否有可能利用Rust类型系统的方式来确保当存在impl B for &A
时,我们不会为&B
创建一个实现?