我们有两个特征A
和B
B
的所有类型轻松实现A
。A
对任何实现A
的类型的引用。B
对任何实现B
的类型的引用。实际上,所有三个都会导致冲突,因为现在对实现A
的类型的引用将为它们提供两个B
的实现。一个归因于impl<T: A> A for &T
,一个归因于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
创建一个?
答案 0 :(得分:3)
关于这个主题有一些discussion on the Rust internals forum,从a blog post by Nicholas Matsakis开始,关于如何处理重叠特征实现的问题。
今天,(不稳定)Rust有some impl specialisation,但这只适用于更通用的更严格的更具体的内容。
所以我认为答案是今天没有一个好的方法可以做到,但是在将来的某个时候,Rust很有可能会发展为允许表达重叠的特质动词。