Generic traits
Just as types and functions, traits can also have generic types. As different instantiations of a type or function are considered as two separate entities, it's also the same with traits.
For example, the Add trait uses a generic parameter for the right-hand side of the operator, which is useful if you have a type that represents an amount of change for another one, like Duration for Instant in the standard library.
use std::ops::Add;
struct MyInteger;
// Rhs (right-hand side) defaults to Self
impl Add for MyInteger {
  type Output = MyInteger;
  fn add(self, rhs: Self) -> Self::Output {
    MyInteger
  }
}
// Integrated conversion, please don't do this in real code!!
impl Add<MyInteger> for usize {
  type Output = usize;
  
  fn add(self, rhs: MyInteger) -> Self::Output {
    self + 1
  }
}