简而言之,我面临以下问题:我愿意从tokio_util::codec
中抽象出编解码器实现,为此,我定义了一个trait,它将Decoder
和Encoder<T>
作为超trait。
use tokio_util::codec::{Decoder, Encoder};
struct CodecA {}
impl Decoder for CodecA {
type Item = Vec<u8>;
type Error = std::io::Error;
...
}
impl Encoder<Vec<u8>> for CodecA {
type Error = std::io::Error;
...
}
// the synthetic trait based upon Decoder and Encoder
trait Codec<T>: Decoder<> + Encoder<T> {}
impl Codec<Vec<u8>> for CodecA { }
在后面的代码中,当提供dyn Codec<>
作为第二个参数时,我尝试示例化Framed
示例。
let stream = ... ;
let mut lines: Framed<Box<dyn AsyncReadAndWrite>, dyn Codec<Vec<u8>, Error=std::io::Error, Item=Vec<u8>>> ;
match protocol {
KindA => lines = Framed::new(stream, CodecA {}),
KindB => lines = Framed::new(stream, CodecB {}),
}
这就是我不能满足编译器的地方:
Error[E0222]: ambiguous associated type `Error` in bounds of `codec::Codec<Vec<u8>>`
--> src/workers.rs:190:74
|
190 | let mut lines: Framed<Box<dyn AsyncReadAndWrite>, dyn Codec<Vec<u8>, Error=std::io::Error, Item=Vec<u8>>> ;
| ^^^^^^^^^^^^^^^^^^^^ ambiguous associated type `Error`
|
= note: associated type `codec::Codec<Vec<u8>>` could derive from `Encoder<Vec<u8>>`
= note: associated type `codec::Codec<Vec<u8>>` could derive from `Decoder`
告诉rustc
编解码器定义中的Error
同时适用于Encode
和Decode
的语法是什么?Item
又如何?最后,是否有其他方法?
1条答案
按热度按时间3htmauhk1#
可以将关联类型更改为通用参数: