我试图理解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
有人能解释一下这种行为吗那什么才是正确的呢
1条答案
按热度按时间8tntrjer1#
super
泛型约束不是很有用。如果你有一个这样的方法:你只知道
T
是Animal
的某种超类型,这没有多大帮助。你不能在t
上调用任何特定于Animal
的方法,因为T
可能是Object
(Animal
的超类)。你可以安全地做的就是调用在Object
中声明的方法,这与t
没有太大区别。即使在返回类型中使用了
T
:你只知道你至少可以返回
Animal
的一个示例,或者它的任何一个子类,比如Cat
。同样,这与以下没有太大区别:也就是说,当您将其用作通配符时,
super
绑定是可能的:这允许调用者传递任何列表,可以将
Animal
或其任何子类的示例添加到列表中。