我们有两个特点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 {}
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
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 `&_`
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式使用Rust类型系统来确保当存在时impl B for &A
,我们不为其创建一个&B
?
Rust 内部论坛上对此主题进行了一些讨论,首先是Nicholas Matsakis 的博客文章Nicholas Matsakis 发表的一篇关于如何处理重叠特征实现问题的
如今,(不稳定的)Rust 有一些 impl 专业化,但这仅适用于更通用的 impl 的严格更具体的 impl。
所以我认为答案是,今天没有一个好的方法来做到这一点,但在未来的某个时候,Rust 很可能会发展到允许表达重叠的特征实现。
归档时间: |
|
查看次数: |
564 次 |
最近记录: |