我有一个IntPair<T>
类型,它在某些元素的类型上是通用的。元素类型T
可以是某种最小限制类型(Int64
),也可以是某种限制性更大的类型,可以提供更多的保证(Int32
,在这种情况下可以保证减少可能的值范围) 。
限制性较高的元素类型实现的Into
限制性较小的元素类型。我希望将这种转换概括地带入类型IntPair<T>
中,该类型使用其他类型作为元素。
这是一个例子:
pub struct Int32(pub i32);
pub struct Int64(pub i64);
impl Into<Int64> for Int32 {
fn into(self) -> Int64 {
Int64(self.0 as i64)
}
}
pub struct IntPair<T> {
pub x: T,
pub y: T,
}
impl<T: Into<Int64>> Into<IntPair<Int64>> for IntPair<T> {
fn into(self) -> IntPair<Int64> {
IntPair {
x: self.x.into(),
y: self.y.into(),
}
}
}
fn main() {
let p32: IntPair<Int32> = IntPair {
x: Int32(3),
y: Int32(9),
};
let p64: IntPair<Int64> = p32.into();
}
不幸的是,此代码不起作用。
error[E0119]: conflicting implementations of trait `std::convert::Into<IntPair<Int64>>` for type `IntPair<_>`:
--> src/main.rs:12:1
|
12 | impl<T: Into<Int64>> Into<IntPair<Int64>> for IntPair<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T, U> std::convert::Into<U> for T
where U: std::convert::From<T>;
据我了解,编译器不能保证没有From<IntPair<T>> for IntPair<Int64>
的隐含含义,因为Into<IntPair<Int64>> for IntPair<T>
不是具体类型,否则将引发IntPair<T>
的隐含隐含含义
这很有道理,但我仍希望使用此功能。我能想到的唯一解决方案是创建自己的特征,该特征的行为与Into
相同。但是,这并不理想,因为该类型不适用于接受impl Into<IntPair<Int64>>
的方法。
有没有一种方法可以使该impl编译?