The same effect could be achieved with type parameters, which are equivalent to Java generics. Sometimes though, abstract type members are more powerful and cannot be substituted by type parameters.