Compile-time resolution of Generic methods

The draft Java Language Specification has this to say about Overloading.

8.4.9 Overloading

When a method is invoked, the number of actual arguments (and any
explicit type arguments) and the compile-time types of the arguments are used, at
compile time, to determine the signature of the method that will be invoked.

The difference here is the extra rule within braces.

This is the JLS second edition.

When a method is invoked, the number of actual arguments and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked.

Now code written using JDK 5.0 relies on the type arguments to determine the correct method even if we have two methods with the same name and no parameters like the following code.

public class Overloading {

public static <A extends String> A test() {
System.out.println("String");
return null;
}

public static <B extends Integer> B test() {
System.out.println("Number");
return null;
}

public static void main(String[] args) {
Overloading.<Integer>test();
Overloading.<String>test();
}
}

What I cannot do with generics ?

I am still trying to understand the full benefits of generics. I picked up the following that you cannot do with Java generics from the Sun generics forum where sometime back a generics debate was raging.

Use constants.
Cannot perform compile-time recursion.
Cannot do compile-time loop unrolling.
Cannot create full or partial specializations.
Cannot work with primitive types.
Cannot create arrays of generic types.
Cannot check generic casts at compile time.
Cannot do type analysis at compile time.
Cannot do anything with generics that would create multiple instantiations of the generic code.
Though I am not a C++ programmer, I found this article http://www.langer.camelot.de/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm that would support many of the above points. It looks like a serious drawback of the Java implementation of generics.

  It would be interesting to check how many of the above are possible using C#.