The first method allows you to do things such as typeof(T)that you could not do with a non-generic type, since the object itself may be null (since you need to call item.GetType()).
You can also dictate the return type (if instead it was not invalid), for example:
public class Butter : Product { }
public class Egg : Product { }
public class Product { }
public T AddGeneric<T>(T item) where T : Product
{
return item;
}
public Product Add(Product item)
{
return item;
}
Product t = Add(new Egg());
Egg tt = AddGeneric(new Egg());
, ( ).