Function<? super T, ? extends String> 理解
Function<? super T, ? extends V>
的泛型参数设计是为了增加灵活性,允许参数类型为 T
或 T
的父类型,并且返回类型可以是 V
或 V
的子类型。这种设计在处理层次化的类型时非常有用,可以让代码更加通用。
以下是一个详细的例子,通过一个简单的动物继承结构来说明 Function<? super T, ? extends V>
的作用。
示例场景
假设我们有以下类:
class Animal {String getName() {return "Animal";}
}class Dog extends Animal {@OverrideString getName() {return "Dog";}
}class Cat extends Animal {@OverrideString getName() {return "Cat";}
}
接下来我们定义一个方法 describeAnimal
,使用 Function<? super T, ? extends String>
来描述动物的名称。
使用 Function<? super T, ? extends String>
的 describeAnimal
方法
我们想要一个通用的方法来描述动物的名称。这个方法可以接受 Function
对象,该 Function
的参数类型可以是 T
(例如 Dog
、Cat
)或 T
的父类型(例如 Animal
),返回值可以是 String
或 String
的子类型。
import java.util.function.Function;public class Main {public static void main(String[] args) {Dog dog = new Dog();Cat cat = new Cat();// Function 参数类型是 Animal,可以接收 Dog 或 Cat 的实例Function<Animal, String> animalNameFunction = Animal::getName;// 调用 describeAnimal,传入 Function<Animal, String>System.out.println(describeAnimal(animalNameFunction, dog)); // 输出: DogSystem.out.println(describeAnimal(animalNameFunction, cat)); // 输出: Cat}// 泛型方法,接收 Function<? super T, ? extends String>,描述传入动物的名称public static <T extends Animal> String describeAnimal(Function<? super T, ? extends String> function, T animal) {return function.apply(animal); // 使用 function 来获取动物的描述}
}
分析
-
describeAnimal
方法中的Function<? super T, ? extends String>
参数,允许传入类型为T
或T
的父类型的Function
,从而增强了方法的通用性。 -
animalNameFunction
是一个Function<Animal, String>
,可以接收Animal
或其子类对象。我们可以将Function<Animal, String>
作为参数传给describeAnimal
,并用于Dog
和Cat
类型的对象。
为什么这样设计?
? super T
:使得Function
的输入可以接受T
或T
的父类。这样,我们就可以用一个Function<Animal, String>
来处理Dog
、Cat
这些不同的Animal
子类对象。? extends V
:使得Function
的返回值可以是String
或String
的子类,增加了返回类型的灵活性。
总结
- 使用
Function<? super T, ? extends V>
可以灵活地传入多种Function
,增强了泛型方法的通用性和适应性。 - 在这个例子中,我们成功地用
Function<Animal, String>
处理了Dog
和Cat
实例,实现了灵活的类型匹配。