How do Java, C++, C#, etc. get around this particular syntactic ambiguity with < and >?
a generic method call in java would be <h,i>g(j)
so there is no ambiguity :)
I just can't imagine any non-hacky/context-free way of dealing with this, and I'm baffled at how any such language can be context-free, let alone LALR(1)-parsable...
The answer is that they aren't (at least not Java and C++; I know very little about C#). The Java grammar that you link to dates back to 1996, way before generics have been introduced.
For further discussion, see Are C# and Java Grammars LALR(x)?