static void basket(List<? super Apple>list){list.add(new Object());}
you are telling compiler, that you provide List with parameter of type Object or
Fruit (if I remember correctly) or Apple.
So, it will only allow to insert type, which won't break any of these conditions.
Suppose, you call basket method with parameter of type List<Apple>, and now you want to insert Object. This would corrupt type safety.
Suppose, you want to insert Apple or any sub-class of Apple. This is OK, because it can be safely upcasted to any type, that can occur as parameter in List<? super Apple>