The Need for Wildcards

We are covering generics in my advanced Java community college class. The weak book has a tough time explaining concepts clearly. I get the main idea behind generics. Java gets to keep up with C++ templates. But then we get to something which does not seem right.

Since the Integer class extends Number, you can pass in an Integer object when a function requires a Number parameter. That is clear. But when you use those types with a generic class such as Stack, things get weird. You cannot pass in an object of type Stack when a function requires a Stack parameter. What the heck?

Integer extends Number. The Stack is a Stack. Why can't Stack act as a Stack. Makes no sense on the outside. The book cooked up some example to try to explain it away. I was still not convinced. Later I read about the use of wildcards to solve this problem. You get a Stack argument type that can then receive a Stack. But why do we need this new syntax in the first place. The textbook could not explain it. Time to dig deeper.