"Just use maps" in Java?

That’s by design. Many times, especially when debugging complex algorithms, you’re more interesting in what object in memory is being referenced and don’t really care about the contents. At some point, languages that don’t do that annoy me when you think two objects are the same because the contents are identical but they’re actually different objects in memory. So, it’s a design decision done on purpose. I’m actually glad they did it that way.

Right, because you designed it poorly to begin with. You’d also have to refactor your Clojure code if Tank called its location x-pos and y-pos instead of x and y like Player did. You can screw things up in both cases. Setting up a poor design strawman doesn’t work.

Java is one of those languages, if you design things correctly. What you just described is an interface. There are several ways of dealing with that interface to not need to duplicate code.

It’s two different ways of approaching things and, like I’ve said dozens of times on here, in the end they both do the same thing. Which one you’d rather use is a personal choice. One of the key reasons Java took off is because of the extensive toolkit of data structures it offers. The Java community rejected the idea of turning everything into a nail so that your hammer works. Clojure thinks that way of doing it is awesome. Neither one is more right than the other.