java override generic abstract method