Java泛型变量可以通过添加约束来限制其接受的类型范围。泛型约束指定了泛型变量(T)必须满足的条件,从而使泛型类型更加安全、清晰,减少运行时错误。
Java中常用的泛型约束主要包括:
- extends 约束:用于指定泛型变量(T)必须是某个类/接口的子类/实现类
- super 约束:用于指定泛型变量(T)必须是某个类/接口的父类/实现类
下面分别介绍这两种约束的使用方法:
- extends 约束示例
public class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
}
public class Cage<T extends Animal> {
T animal;
public Cage(T animal) {
this.animal = animal;
}
public String getName() {
return animal.getName();
}
}
public class Main {
public static void main(String[] args) {
Cage<Dog> dogCage = new Cage<>(new Dog("Tommy"));
Cage<Cat> catCage = new Cage<>(new Cat("Kitty"));
// Cage<String> stringCage = new Cage<>("Hello"); // 会编译报错
System.out.println(dogCage.getName()); // 输出 "Tommy"
System.out.println(catCage.getName()); // 输出 "Kitty"
}
}
在上述示例中,我们定义了Animal
类、Dog
类、Cat
类,并将Cage
类的泛型变量(T)添加一个extends
约束,要求只能传入Animal
类的子类作为泛型参数。这样做可以保证Cage
类只能存储Animal
类的实例或其子类的实例,避免了所有一切不符合约束的操作。
- super 约束示例
public class Box<T> {
T data;
public Box(T data) {
this.data = data;
}
}
public class Main {
public static <T super Number> void print(Box<T> box) {
System.out.println(box.data);
}
public static void main(String[] args) {
Box<Integer> box1 = new Box<>(1);
Box<Double> box2 = new Box<>(2.0);
// Box<String> box3 = new Box<>("Hello"); // 会编译报错
print(box1); // 输出 "1"
print(box2); // 输出 "2.0"
}
}
在上述示例中,我们定义了一个Box
类来存储任意类型的数据,然后使用泛型方法print
来打印Box
类实例中存储的数据,但是我们添加了一个super
约束来限制泛型变量(T)的类型范围,该约束表明泛型变量(T)必须是Number
类的父类。
这样做可以保证我们只能传入存储Number
类型数据的Box
类实例,而不能传入其它类型的实例,从而避免了类型转换错误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java泛型变量如何添加约束 - Python技术站