// run-pass trait SignedUnsigned { type Opposite; fn convert(self) -> Self::Opposite; } impl SignedUnsigned for isize { type Opposite = usize; fn convert(self) -> usize { self as usize } } impl SignedUnsigned for usize { type Opposite = isize; fn convert(self) -> isize { self as isize } } fn get(x: isize) -> ::Opposite { x.convert() } fn main() { let x = get(22); assert_eq!(22, x); }