考虑以下 Rust 代码 []:
use std::collections::HashMap;
use std::hash::Hash;
trait Foo<K> {
const FOO: i32;
}
impl<K, K_, V> Foo<HashMap<K_, V>> for HashMap<K, V>
where
K: Hash + Eq + Into<K_>,
{
const FOO: i32 = 1;
}
impl<K, V, V_> Foo<HashMap<K, V_>> for HashMap<K, V>
where
K: Hash + Eq,
V: Into<V_>,
{
const FOO: i32 = 2;
}
fn main() {}
(The const
不相关,我想要编译代码fn
s too).
它无法编译并出现错误:
error[E0119]: conflicting implementations of trait `Foo<std::collections::HashMap<_, _>>` for type `std::collections::HashMap<_, _>`:
--> src/main.rs:15:1
|
8 | / impl<K, K_, V> Foo<HashMap<K_, V>> for HashMap<K, V>
9 | | where
10 | | K: Hash + Eq + Into<K_>,
11 | | {
12 | | const FOO: i32 = 1;
13 | | }
| |_- first implementation here
14 |
15 | / impl<K, V, V_> Foo<HashMap<K, V_>> for HashMap<K, V>
16 | | where
17 | | K: Hash + Eq,
18 | | V: Into<V_>,
19 | | {
20 | | const FOO: i32 = 2;
21 | | }
| |_^ conflicting implementation for `std::collections::HashMap<_, _>`
据我了解,问题在于这里存在歧义 - 应该选择哪个实现if两者都合法吗?理想情况下,我希望拥有以下内容:
- 上面的代码(或一些解决方法)应该可以正常编译。
- 在调用站点,如果只有一个
impl
对于给定的类型可能存在,然后选择该类型。
- 在调用站点,如果有多个
impl
如果有可能,那么它就是一个错误(连贯性问题)。
更简洁地说,我希望在调用站点而不是在定义站点完成歧义解决。有可能有这种行为吗?