Negative id values would try to access the array out of bounds and throw an java.lang.ArrayIndexOutOfBoundsException.
Reobtaining a constructor is not a trivial operation, this change makes the Material enum store the respective constructors for each MaterialData. Additionally 'fixed' the material tests to use proper generics.