I think that generics are useless for remove and get methods in ModelData class. They don't check any type (you can put the return value in any type you want), they just hide the cast to X. At least for the set method it is used to check that return value has the same type than the value parameter.