编译器看不到关联类型与具体类型相同

Compiler doesn't see associates type is the same as concrete type

我的项目中有一点麻烦,我无法解决:编译器看不到关联类型与具体类型相同,不会让我进行赋值。

Playground

有谁知道如何修复它。感谢您抽出宝贵时间。

阿托斯

// This program fails to compile 
// Compiler doesn't see that the associated type and type of user id are the same. 
struct User {
    pub id: u64,
}

trait KeyTrait {
    type Key;
    fn key(&self) -> Self::Key;
}

impl KeyTrait for User {
    type Key = u64;
    fn key(&self) -> Self::Key {
        self.id
    }
}

trait PrintTrait {
    fn print_key<K: KeyTrait>(key: K);
}

impl PrintTrait for User {
    fn print_key<K: KeyTrait>(key_impl: K) {
        let id: u64 = key_impl.key(); // Raises error: expected u64, found associated type

        println!("Found key {}", id);
    }
}

fn main() {
    let user = User { id: 5 };
    User::print_key(user);
}

此代码假设 KeyTrait 的每个 实现具有相同的关联 Key 类型。

impl PrintTrait for User {
    fn print_key<K: KeyTrait>(key_impl: K) {
        let id: u64 = key_impl.key();
        println!("Found key {}", id);
    }
}

事实上,KeyTrait 的实现可以选择任何类型。

您可以在类型系统中对这个假设进行编码:

trait PrintTrait {
    fn print_key<K>(key: K)
    where
        K: KeyTrait<Key = u64>;
}

impl PrintTrait for User {
    fn print_key<K>(key_impl: K) 
    where
        K: KeyTrait<Key = u64>,
    {
        let id: u64 = key_impl.key();
    }
}

或者,如果您需要 PrintTrait 对所有可能关联的 Key 类型通用:

trait PrintTrait<T> {
    fn print_key<K>(key: K)
    where
        K: KeyTrait<Key = T>;
}

impl PrintTrait<u64> for User {
    fn print_key<K>(key_impl: K) 
    where
        K: KeyTrait<Key = u64>,
    {
        let id: u64 = key_impl.key();
    }
}