Java泛型是JDK 5.0引入的一个新特性,它允许在定义类、接口和方法时使用类型参数。泛型的主要目的是提高Java程序的类型安全,消除类型转换,并允许算法更加灵活地处理不同类型的数据。
类型参数:在定义泛型类、接口或方法时,使用尖括号(<>)括起来的大写字母(如T、E、K、V等)表示类型参数。
泛型类:在类名后面使用尖括号指定类型参数的类。
泛型接口:与泛型类类似,接口也可以定义为泛型。
泛型方法:在方法返回类型前使用尖括号指定类型参数的方法。
<?>
<? extends T>
<? super T>
ArrayList<T>
、HashMap<K, V>
等。public class Box<T> {
private T value;
public Box(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
public class Util {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
public class Main {
public static void main(String[] args) {
Box<Integer> integerBox = new Box<>(123);
System.out.println(integerBox.getValue());
String[] strings = {"Hello", "World"};
Util.printArray(strings);
}
}
问题:Java泛型在编译时会进行类型擦除,这意味着运行时无法获取泛型的具体类型。
解决方法:使用反射或传递类型标记(Type Token)来获取具体类型信息。
public class GenericClass<T> {
private Class<T> type;
public GenericClass(Class<T> type) {
this.type = type;
}
public Class<T> getType() {
return type;
}
}
问题:不能直接使用new T()
来创建泛型类型的实例。
解决方法:通过传递构造函数或使用工厂方法来创建实例。
public interface Factory<T> {
T create();
}
public class IntegerFactory implements Factory<Integer> {
@Override
public Integer create() {
return new Integer(0);
}
}
问题:不能直接创建泛型类型的数组,如new T[10]
。
解决方法:使用Array.newInstance
方法或通过对象数组进行转换。
public class GenericArray<T> {
private T[] array;
@SuppressWarnings("unchecked")
public GenericArray(Class<T> type, int size) {
this.array = (T[]) Array.newInstance(type, size);
}
}
通过以上方法和示例代码,可以有效地使用Java泛型来提高代码的灵活性和安全性。
领取专属 10元无门槛券
手把手带您无忧上云