What the hell, Java.

Here's how you instantiate a specific template or generic version of an object in C++, C#, and Java:

// C++
MyClass<TemplateType>* myObject = new MyClass<TemplateType>(params);
// C#
MyClass<GenericType> myObject = new MyClass<GenericType>(params);
// Java
MyClass<GenericType> myObject = new MyClass<GenericType>(params);

So far, so good. You can tell C# and Java inherited the syntax directly from C++.

Here's how you call a specific template or generic version of a method in each of the languages:

// C++
myObject->method<TemplateType>(params);
// C#
myObject.method<GenericType>(params);
// Java
myObject.<GenericType>method(params); // ???

How does that make any sense?