实现具有特定类型参数的泛型结构时出现类型不匹配错误

Mismatched types error when implementing a generic struct with a specific type parameter

提问人:Alberto 提问时间:11/10/2023 最后编辑:Chayim FriedmanAlberto 更新时间:11/10/2023 访问量:38

问:

我正在尝试实现一个通用结构 A1Implementation,它采用一个类型参数 B,该参数应该实现特征 A1。但是,当我尝试创建具有特定类型Ex1_A1的 A1Implementation 实例时,编译器会给出以下错误:

mismatched types
expected type parameter `B`
       found struct `Ex1_A1`

这是我的代码片段:

struct A1Implementation<B: A1>(B);

impl <B: A1> Default for A1Implementation<B> {
    fn default() -> Self {
        Self(Ex1_A1)
    }
}

我知道该错误表明预期的类型参数 B 与找到的类型 Ex1_A1 不同。但是,Ex1_A1确实实现了 A1 特征。

有人可以帮助我了解为什么会发生此错误以及如何实现类似的行为吗?我想创建一个具有实现 A1 特征的特定类型的 A1Implementation 实例。

仿制药 蚀性状

评论


答:

2赞 Chayim Friedman 11/10/2023 #1

Self 始终表示“子句中的类型”。impl

子句中的类型是 ,这与返回的类型不同。implA1Implementation<B>A1Implementation<Ex1_A1>

您有两种选择:

  1. 对 any 实现,并返回 的默认值:DefaultA1ImplementationB

    impl<B: A1 + Default> Default for A1Implementation<B> {
        fn default() -> Self {
            Self(B::default())
        }
    }
    

    (这个imple可以推导出来)。

    这允许将任何类型参数与 impl 一起使用,但不为其提供默认类型。Default

  2. 仅针对以下情况实现:DefaultA1Implementation<Ex1_A1>

    impl Default for A1Implementation<Ex1_A1> {
        fn default() -> Self {
            Self(Ex1_A1)
        }
    }
    

    这选择了相反的权衡:仅允许 ,但也默认为。Ex1_A1

评论

0赞 mdx97 11/10/2023
很好的解释。对于 OP,考虑泛型实现的另一种方式是,您基本上是在编写编译器将针对满足该实现的每个具体类型(也称为单态化)复制的代码。假设你有另一种类型也实现了这个特征;原始的泛型 impl 将导致编译器为其创建一个 impl 尝试返回 的实例,这显然是错误的。希望这会有所帮助。Ex2_A1A1DefaultDefaultAllImplementation<Ex2_A1>AllImplementation<Ex1_A1>