例子代码是这样的:
trait A {}
impl<T> A for Vec<T> {}
impl<T: AsRef<u32>> A for T {}
这个示例代码编译报错:
Compiling playground v0.0.1 (/playground)
error[E0119]: conflicting implementations of trait `A` for type `std::vec::Vec<_>`:
--> src/lib.rs:4:1
|
3 | impl<T> A for Vec<T> {}
| -------------------- first implementation here
4 | impl<T: AsRef<u32>> A for T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `std::vec::Vec<_>`
|
= note: upstream crates may add a new impl of trait `std::convert::AsRef<u32>` for type `std::vec::Vec<_>` in future versions
error: aborting due to previous error
For more information about this error, try `rustc --explain E0119`.
error: could not compile `playground`.
看了半天资料并搜索没有看懂,最接近的一个回答是这个: Conflicting implementations of trait in Rust
请求大佬解答
1
共 3 条评论, 1 页
评论区
写评论孤儿规则
如果未来Vec实现了AsRef,那么Vec就会满足U的要求,从而Vec会有两份A的实现。 这个问题以前遇到过,但没找到一个比较好的解决办法,只能先用个本地的类型把它包一下,比如:
但我不确定这么做合不合适,有没有比较了解的朋友说一下?
这个报错不是写的很清楚嘛
(未来std::convert::AsRef可能会被std::vec::Vec<_>实现,就冲突了