When calling a default implementation on a trait which does not take self
, why does it neeed an implementing type to be annotated?
A minimal, reproducible ex
Provided methods in Rust are not like static
methods in Java. Even a function with no arguments and a default implementation can be overridden by implementors. Consider adding another type that implements Builder
but overrides the new
function:
struct Noisy {}
impl builder::Builder for Noisy {
fn new() -> builder::Simple {
println!("Ahahahah I'm creating a Simple!!!11!");
builder::Simple
}
}
fn main() {
// wait, should this call builder::Simple::new() or Noisy::new()?
let _ = builder::Builder::new();
}
If you want the effect of a Java static
function that always has the same behavior, you should use a free function, as prog-fh's answer also suggests.