Some hints on how different JAVA generics appear to be to .NET generics

26.01.2007 - 14:06 (5 years, 1 week, 3 days ago)

programming, dotnet, JAVA, TrivadisContent

A tss entry caught my curiosity as it was talking about a "generics puzzle" in JAVA. Finally, I thought, an example-based look at how JAVA generics differ from their .NET pendant? Indeed, the puzzle turns out to not be one in e.g. C#.

If the intent is to be able to create instances of a provided type argument, we need a constrain on the provided type argument to provide a parameterless constructor...

  class GenericCheck<T> where T : new() {
    public T Instance {
      get {
        return Activator.CreateInstance<T>();
      }
    }
  }
Beware, though that if T has no default constructor, construction will fail with a MissingMethodException. Funny enough though, the Activator's method has no constraint on T, which it could easily implement:
  public V CreateInstance<V>() where V : new() ...
Apart from that you could also construct types that have no default constructor. Just sprinkle in some reflection. The type in question is easily accessed with typeof(T)...
  class GenericCheck<T> {

    public T Instance(string name, int age) {
        Type t = typeof(T);
        ConstructorInfo info = t.GetConstructor(
           new Type[] { typeof(string), typeof(int) });
        if (info != null) {
          return (T)info.Invoke(BindingFlags.CreateInstance,
             null,new object[] { name, age },null);
        }
        return default(T);
    }

  }

...
    public static void Test() {
      GenericCheck<Person> gp = new GenericCheck<Person>();
      Person p = gp.Instance("martha", 24);
    }
What you don't get with this approach is type safety, and you'll probably have a performance penalty, but that's another subject. So, no puzzles to be seen...