📅  最后修改于: 2023-12-03 15:32:03.886000             🧑  作者: Mango
Java泛型是Java语言中的一项非常强大的特性,它允许我们在编写程序时定义一种数据类型,可以用来代替真实的数据类型。而且,Java泛型不仅可以用于类、接口定义中,还可以用于方法的参数、返回值、变量等多种类型的参数。
泛型类指的是被参数化的类,也就是说,它的数据类型是由类的使用者来指定的。我们可以通过在类名后面添加<T>
这样的语句来定义泛型类。例如:
public class GenericClass<T> {
private T value;
public T getValue() {
return this.value;
}
public void setValue(T value) {
this.value = value;
}
}
上述的GenericClass
就是一个泛型类,它的类型由<T>
所指定。使用时,我们可以为T
指定任何类型,例如:
GenericClass<String> str = new GenericClass<>();
str.setValue("Hello, World!");
System.out.println(str.getValue()); // Hello, World!
GenericClass<Integer> num = new GenericClass<>();
num.setValue(123);
System.out.println(num.getValue()); // 123
上述的代码展示了如何创建GenericClass
泛型类的实例,并传递不同类型的参数。
泛型方法指的是被参数化的方法,它可以对参数、返回值或者本地变量使用泛型类型。我们可以在方法的返回值、参数列表或者方法名前面添加<T>
这样的语句来定义泛型方法。例如:
public class GenericMethod {
public static <T> void print(T value) {
System.out.println(value);
}
}
上述的GenericMethod
就是一个包含泛型方法的类,它的print
方法可以接收任何类型的参数,比如:
GenericMethod.print("Hello, World!"); // Hello, World!
GenericMethod.print(123); // 123
GenericMethod.print(3.14); // 3.14
泛型接口指的是被参数化的接口,它的类型也是由实现类来指定的。我们可以在接口名后面添加<T>
这样的语句来定义泛型接口。例如:
public interface GenericInterface<T> {
T getValue();
void setValue(T value);
}
上述的GenericInterface
就是一个包含泛型类型参数的接口,它的实现类必须指定T
的具体类型。例如:
public class GenericClass<T> implements GenericInterface<T> {
private T value;
@Override
public T getValue() {
return this.value;
}
@Override
public void setValue(T value) {
this.value = value;
}
}
上述的代码展示了如何实现一个泛型接口。
通配符是Java泛型中用来表示未知类型的符号,可以用在泛型方法、泛型类、泛型接口的定义中。通配符一般用?
来表示,例如:
public class GenericClass<T> {
// 可以接收任何类型的参数
public void print(GenericClass<?> obj) {
System.out.println(obj.value);
}
}
上述的print
方法中定义了一个通配符来表示传递的参数类型未知。它可以接收任何类型的参数,例如:
GenericClass<String> str = new GenericClass<>();
GenericClass<Integer> num = new GenericClass<>();
str.print(str); // Hello, World!
num.print(num); // 123
上述的代码展示了如何使用通配符来定义泛型方法中的参数类型。
Java泛型中的上下界限定可以让我们对类型参数进行限制,从而提高程序的可读性和鲁棒性。其中,上界限定使用extends
关键字来指定,下界限定使用super
关键字来指定。例如:
public class GenericClass<T extends Number> {
private T value;
public T getValue() {
return this.value;
}
public void setValue(T value) {
this.value = value;
}
}
上述的GenericClass
限定了它的类型参数必须是Number
类或者其子类。这样可以有效避免一些类型转换的问题。
另外,下界限定可以用来限定某个类型必须是某个类的父类或者本身,例如:
public void printList(List<? super Integer> list) {
// 可以往列表中添加Integer及其子类对象
list.add(new Integer(3));
list.add(new Long(123L));
list.add(new Double(3.14));
// 不能往列表中添加其他类型的对象
list.add(new String("abc")); // compile error
}
上述的printList
方法中定义了一个下界限定来限制传递的参数必须是Integer
类的父类或者本身。这样,我们可以往列表中添加Integer
及其子类对象,而不能添加其他类型的对象。
Java泛型可以为程序提供很多好处,例如类型安全、减少类型转换等等。不过,如果滥用泛型,会导致程序变得复杂而难以理解。因此,合理地使用Java泛型可以提高程序的可维护性和可扩展性。