私にとって、これらの答えはどれも私を助けてくれましたが、十分に明確ではありませんでした。よく調べた後、つまりたくさんのことを言った後、私はついにワイルドカードの最も簡単な説明を思いつきました。
public class CatTest {
    public class Animal {}
    public class Cat extends Animal {}
    public class MyCat extends Cat {}
    public class Dog extends Animal {}
    public static void main(String[] args) {
        List<Animal> animalList = new ArrayList<>();
        List<Cat> catList = new ArrayList<>();
        List<MyCat> myCatList = new ArrayList<>();
        List<Dog> dogList = new ArrayList<>();
        CatTest catTest = new CatTest();
        // Here you are trying to add a MyCat instance (in the addMethod we create a MyCat instance). MyCat is a Cat, Cat is an Animal, therefore MyCat is an Animal.
        // So you can add a new MyCat() to a list of List<Animal> because it's a list of Animals and MyCat IS an Animal.
        catTest.addMethod(animalList);
        // Here you are trying to add a MyCat instance (in the addMethod we create a MyCat instance). MyCat is a Cat. 
        // So you can add a new MyCat() to a list of List<Cat> because it is a list of Cats, and MyCat IS a Cat
        catTest.addMethod(catList);
        // Here you are trying to add a MyCat instance (in the addMethod we create a MyCat instance). MyCat is a Cat.
        // Everything should work but the problem here is that you restricted (bounded) the type of the lists to be passed to the method to be of
        // a type that is either "Cat" or a supertype of "Cat". While "MyCat" IS a "Cat". It IS NOT a supertype of "Cat". Therefore you cannot use the method
        catTest.addMethod(myCatList); // Doesn't compile
        // Here you are adding a MyCat instance (in the addMethod we create a MyCat instance). MyCat is a Cat. 
        // You cannot call the method here, because "Dog" is not a "Cat" or a supertype of "Cat"
        catTest.addMethod(dogList); // Doesn't compile
    }
    public void addMethod(List<? super Cat> catList) {
        // Adding MyCat works since MyCat is a subtype of whatever type of elements catList contains
        // (for example Cat, Animal, or Object)
        catList.add(new MyCat());
        System.out.println("Cat added");
    }
}
最後に、これらは結論です:
ワイルドカードを使用する場合、ワイルドカードは、要素をリストに追加しようとしたときに要素のタイプではなく、メソッドに引数として渡されるリストのタイプに適用されます。この例では、次のコンパイルエラーが発生します。
  タイプCatTestのメソッドaddMethod(List)は、引数(List)には適用できません。
ご覧のとおり、エラーはメソッドのシグネチャに関するものであり、メソッドの本体に関するものではありません。したがって、「Cat」または「Cat」のスーパータイプ()のいずれかである要素のリストのみを渡すことができますList<Animal>, List<Cat>。
特定のタイプの要素を含むリストを渡すと、リストに追加できるのは「Cat」または「Cat」のサブタイプの要素のみです。つまり、要素のコレクションがある場合は通常どおりに動作します。 !!「猫」のリストに「動物」を追加することはできません。前に述べたように、ワイルドカードは要素自体には適用されず、制限は「リスト」にのみ適用されます。さて、それはなぜですか?単純で、明白で、よく知られている理由のために:
Animal animal = new Dog();
「猫」リストに「動物」を追加できる場合は、「犬」(「犬」は「動物」)を追加することもできますが、「猫」ではありません。