我遇到了一个与相关类型有关的问题.我在So上发现了类似的问题,比如下面这些问题:
- Expected type parameter, found opaque type个
- Matching a generic parameter to an associated type in an impl个
但是,虽然与我的案件非常接近,但它们并不相同……
因此,我有一个相关类型的特征:
trait Generator {
type Item;
fn next(&mut self) -> Self::Item;
}
泛型方法的另一个特征,它将第一个作为类型参数:
trait Iterator {
fn iterate<T>(&self, generator: T) -> T::Item
where T: Generator;
}
到目前为止一切都还好.
现在我想创建一个 struct ,并为它实现Iterator
个特征.
struct Baz<R> { // I want my struct to keep data of the same type as my associated type
data: Vec<R>, // So i make my struct generic
}
impl<R> Iterator for Baz<R>
{
fn iterate<T>(&self, generator: T) -> T::Item
where T: Generator<Item = R> // And specify associated type constraint for generic method
{
generator.next()
}
}
现在我收到了一个错误:
error[E0271]: type mismatch resolving `<T as Generator>::Item == R`
--> src/main.rs:20:28
|
17 | impl<R> Iterator for Baz<R>
| - this type parameter
...
20 | where T: Generator<Item = R>
| ^^^^^^^^ expected associated type, found type parameter `R`
|
= note: expected associated type `<T as Generator>::Item`
found type parameter `R`
= note: you might be missing a type parameter or trait bound
note: the requirement `<T as Generator>::Item == R` appears on the `impl`'s method `iterate` but not on the corresponding trait's method
--> src/main.rs:9:8
|
8 | trait Iterator {
| -------- in this trait
9 | fn iterate<T>(&self, generator: T) -> T::Item
| ^^^^^^^ this trait's method doesn't have the requirement `<T as Generator>::Item == R`
我想要修复它,我必须使我的Iterator特征成为泛型,并在特征定义中指定约束:
trait Iterator<R> {
fn iterate<T>(&self, generator: T) -> T::Item
where T: Generator<Item = R>;
}
还可以更新Iml块:
impl<R> Iterator<R> for Baz<R>
{
...
}
但不幸的是,这个特征来自第三方库,所以我不能更新他们的源代码(更确切地说,这是来自serde库的SeqAccess特征)
所以我的问题是:在这种情况下,有没有办法声明关联的类型约束,而不向特征本身添加类型参数?