Java泛型(Generics)允许你定义类、接口和方法时使用类型参数,从而实现更加灵活的代码复用。通过使用泛型,你可以编写一个类或方法,而不需要指定具体的类型,直到创建对象或者调用方法的时候才确定具体类型。这可以增加代码的安全性和可读性,减少类型转换的错误。
泛型类的定义
要定义一个泛型类,你需要在类名后面跟上类型参数列表,这个列表被尖括号<>
包围。类型参数通常使用单个大写字母表示,最常用的是E
(Element)、T
(Type)、K
(Key)、V
(Value)等。
public class Box<T> {
// T stands for "Type"
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
在这个例子中,Box<T>
是一个泛型类,其中T
是类型参数。这意味着Box
可以用来创建任何类型的对象,比如Box<Integer>
、Box<String>
等等。
使用泛型类
当你想要使用泛型类时,你需要指定实际的类型参数。这通常是在创建对象实例时完成的。
Box<Integer> integerBox = new Box<>(); integerBox.set(10); System.out.println("Integer Value: " + integerBox.get()); Box<String> stringBox = new Box<>(); stringBox.set("Hello World"); System.out.println("String Value: " + stringBox.get());
上面的例子展示了如何使用Box
类来创建两个不同类型的对象:一个是用于存储整数,另一个是用于存储字符串。
泛型类中的构造函数
泛型类也可以有构造函数,这些构造函数同样可以接受泛型类型的参数:
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
// Getters and setters...
}
然后你可以这样使用它:
Pair<String, Integer> pair = new Pair<>("Key", 42);
泛型方法
除了泛型类,你还可以定义泛型方法,即方法本身带有类型参数。泛型方法可以在静态和非静态上下文中使用,并且可以在类之外独立存在。
public class Util {
// Static generic method
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue());
}
}
调用这个方法时,类型参数可以从上下文推断出来,或者显式地提供:
boolean same = Util.<String, Integer>compare(pair1, pair2);
通配符
有时候你可能不想限制泛型参数为特定的类型,而是希望它可以是某个类型的子类型或父类型。这时你可以使用通配符?
,以及带有限制的通配符<? extends Type>
或<? super Type>
。
public void printList(List<?> list) {
for (Object elem : list) {
System.out.print(elem + " ");
}
System.out.println();
}
public void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 10; i++) {
list.add(i);
}
}
以上就是关于Java泛型类的定义和使用的概述。泛型是Java语言中非常强大的特性之一,它有助于提高代码的质量和灵活性。
本文来自投稿,不代表瓜5博客立场,如若转载,请注明出处:https://blog.gua5.com/xing/36