java super在泛型T super用户定义的类不工作

icomxhvb  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(104)

我试图理解Java泛型中的“super”和“extends”。为此,我做了以下示例/代码:

package com.example.generics;

public class Generics1 {
    
    static <T super Animal> void superDemo() {
        
        
    } 
    
    // "extends" acts like UPPER bound
    // in Hierarchy tree up-to that "class"
    // we can pass on the objects
    
    static <T extends Dog> void  extendsDemoUptoDog(T t) {
        System.out.println("received is --> "+t);
        
    }
    
    static <T extends Cat> void  extendsDemoUptoCat(T t) {
        System.out.println("received is --> "+t);
        
    }
    
    static <T extends Animal> void  extendsDemo(T t) {
        System.out.println("received is --> "+t);
        
    }

    public static void main(String[] args) {
        
    
        Dog dog = new Dog();
        Generics1.extendsDemoUptoDog(dog);
        
        Dog dog1 = new Dog1();
        Generics1.extendsDemoUptoDog(dog1);
        
        
        Dog dog2 = new Dog2();
        Generics1.extendsDemoUptoDog(dog2);
        
        
        Cat cat = new Cat();
        Generics1.extendsDemoUptoCat(cat);
        
        Cat1 cat1 = new Cat1();
        Generics1.extendsDemoUptoCat(cat1);
        
        Cat2 cat2 = new Cat2();
        Generics1.extendsDemoUptoCat(cat2);
        
            
        Animal animal = new Animal();
        Generics1.extendsDemo(animal);
        
        
        // Doesn't work ... we have violated the UPPER BOUND
        // even though "animal" is INHERITED from FatherOfAllAnimal
        FatherOfAllAnimal foal = new FatherOfAllAnimal();
        //Generics1.extendsDemo(foal);
        
    }

}

class FatherOfAllAnimal{}
class Animal extends FatherOfAllAnimal{}
class Dog extends Animal {}
class Cat extends Animal {}
class Tiger extends Animal {}
class Lion extends Animal {}

class Dog1 extends Dog{}
class Dog2 extends Dog1{}
class Dog3 extends Dog2{}

class Cat1 extends Cat{}
class Cat2 extends Cat1{}
class Cat3 extends Cat2{}

以下内容在方法T extends Animal中是可接受的,与方法extendsDemo中一样
但是为什么T super Animal无效,如方法superDemo
有人能解释一下这种行为吗那什么才是正确的呢

8tntrjer

8tntrjer1#

super泛型约束不是很有用。如果你有一个这样的方法:

static <T super Animal> void superDemo(T t) { }

你只知道TAnimal的某种超类型,这没有多大帮助。你不能在t上调用任何特定于Animal的方法,因为T可能是ObjectAnimal的超类)。你可以安全地做的就是调用在Object中声明的方法,这与t没有太大区别。

static void superDemo(Object o) { }

即使在返回类型中使用了T

static <T super Animal> T superDemo() { }

你只知道你至少可以返回Animal的一个示例,或者它的任何一个子类,比如Cat。同样,这与以下没有太大区别:

static Animal superDemo() { }

也就是说,当您将其用作通配符时,super绑定是可能的:

static void superDemo(List<? super Animal> list) { 
    // this is possible, because of the super bound
    list.add(new Cat());
}

这允许调用者传递任何列表,可以将Animal或其任何子类的示例添加到列表中。

相关问题