我正在尝试为这样的结构(playground)定义通用From
实现:
struct Wrapped<T: Clone>(T);
impl<T: Clone, __Into0: ::std::convert::Into<T>> ::std::convert::From<(__Into0)> for Wrapped<T> {
fn from(original: (__Into0)) -> Wrapped<T> {
Wrapped(original.into())
}
}
fn main() {
let _: Wrapped<i64> = 5i32.into();
}
但是,我收到以下错误:
error[E0119]: conflicting implementations of trait `std::convert::From<Wrapped<_>>` for type `Wrapped<_>`:
--> src/main.rs:3:1
|
3 | / impl<T: Clone, __Into0: ::std::convert::Into<T>> ::std::convert::From<(__Into0)> for Wrapped<T> {
4 | | fn from(original: (__Into0)) -> Wrapped<T> {
5 | | Wrapped(original.into())
6 | | }
7 | | }
| |_^
|
= note: conflicting implementation in crate `core`
我猜这是因为From
是为每个类型实现的,而我的新实现还包括一种解决方法。
我不确定如何解决这种类似递归的行为。我能想到的唯一解决方案是使用单个元素元组(playground):
struct Wrapped<T: Clone>(T);
impl<T: Clone, __Into0: ::std::convert::Into<T>> ::std::convert::From<(__Into0,)> for Wrapped<T> {
fn from(original: (__Into0,)) -> Wrapped<T> {
Wrapped(original.0.into())
}
}
fn main() {
let _: Wrapped<i64> = (5i32,).into();
}
这有效,但它使API比我想要的更尴尬。有没有其他方法可以解决这个编译错误?