They're not required -- indeed, I get by without them --, but the topic of the OP is elegance.
Other languages, Nimrod for instance (http://nimrod-lang.org/system.html#515) can manage this while still keeping a simple core, including lots of type-inference. Having generics doesn't automatically turn your language into Java.
The map operator in Nimrod has a definition that is clear and simple:
proc map[T](data: var openarray[T]; op: proc (x: var T): S): seq[S]https://github.com/mediocregopher/seq
It provides clojure-like data-structures and functions for interacting with them (like map and filter). It's completely immutable and generic, and supports lazy operations.
If you're not running into the issues that Go is trying to solve, you don't understand why its solutions are at least somewhat interesting, nor why its trade-offs are reasonable.
It thinks wrong. Making people duplicate code makes it harder to write and maintain large scale software applications.
[Disclaimer: Googler here using Go, yaddi yadda, this is just my opinion]
Actually what you describe is the Java mentality exactly! That's why Java is full of code duplication and is supposed to help with code maintenance.