The ? means that purchase is allowed to reference a Purchase object of any type. So it might be a Purchase<Animal>, Purchase<Lion>, Purchase<String>, Purchase<AnyOtherType> etc.
So when on line 23 you try to call it as if it's referencing a Purchase<Animal>, the compiler can't be certain that's going to be correct. It has no idea which type of Purchase is going to be referenced.
In this particular case the solution is easy: there's no reason to use a wildcard. Just declare the variable with the right type in the first place.
That's right. The compiler will only allow calls it knows are valid, and it only knows about the reference type of the variable, not what's actually going to be stored there.
Wildcards are useful when you need to write functions that are supposed to be able to act on lots of different generic types (like a lot of the methods in the Collections class - they don't often care what type of object is in the collection). In this case you're only asking it to work with Animal lists.