I tried to make this example as minimal as I could. It seems very clear that within the impl Property for MyProperty, Self::State should always be the same type as MyState, but the compiler doesn't seem to know that. Reframing the trait as T: HasStateFor makes the error go away. use std::marker::PhantomData; trait CanGetStateFrom: Property { fn get_state(input: &mut T) -> &mut Self::State; } trait Property { type State; fn update_state(state_source: &mut T) whe...