什么是泛型:
泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,而这种参数类型可以用在类、方法和接口中,分别被称为`泛型类`、`泛型方法`、`泛型接口`。
注意:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
使用泛型的好处:
- 避免了类型强转的麻烦。
- 它提供了编译期的**类型安全**,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。
泛型的使用:
泛型虽然通常会被大量的使用在集合当中,但是我们也可以完整的学习泛型只是。泛型有三种使用方式,分别为:泛型类、泛型方法、泛型接口。将数据类型作为参数进行传递。
泛型类:
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种集合框架容器类,如:List、Set、Map。
public class Box<T> {
private T contents;
public void setContents(T contents) {
this.contents = contents;
}
public T getContents() {
return contents;
}
}
在上面的代码中,Box<T> 中的 T 就是一个类型形参,表示一个占位符类型。在实例化 Box 对象时,需要指定一个具体的类型参数来替换 T;
泛型接口:
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中
public interface List<T> {
void add(T element);
T get(int index);
}
在这里,List<T> 中的 T 是一个类型形参,表示列表中的元素类型。实现该接口时需要指定一个具体的类型参数来替换 T;
泛型方法:
泛型机制可以用于方法的参数类型和返回值类型
public static <T> T getFirstElement(List<T> list) {
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
泛型的实现原理主要涉及三个概念:类型擦除、桥方法和反射。
1.类型擦除
Java 在编译期间会将泛型转换为普通类型,这个过程被称为类型擦除。在类型擦除时,对于泛型类型参数所对应的具体类型,只有在运行时才能确定,而在编译期间是无法确定的。因此,Java 在编译期间会将所有泛型类型转换为其原始类型,也就是没有泛型参数的类型。
例如,List<String> 在编译期间会被转换为 List。
2.桥方法
泛型类中的方法在类型擦除后,如果该方法定义的返回类型是泛型类型参数,那么编译器会生成一个桥方法来确保类的继承关系正确。桥方法的作用是将泛型方法转换为普通方法,以便在运行时调用。例如,假设有以下泛型类:
class MyClass<T> {
public T getValue() {
return null;
}
}
在类型擦除后,该类会变为:
class MyClass {
public Object getValue() {
return null;
}
}
但是,由于 getValue() 方法在 MyClass 中被声明为返回类型为 T 的方法,因此,编译器会自动生成一个桥方法,用于确保类的继承关系正确。生成的桥方法如下:
class MyClass {
public Object getValue() {
return this.getBridgeValue();
}
public T getBridgeValue() {
return null;
}
}
3.反射
Java 的反射机制可以让程序在运行时获取类的信息,包括泛型类型参数的信息。例如,可以通过 Class 类中的 getGenericSuperclass() 和 getGenericInterfaces() 方法获取类和接口中声明的泛型类型参数的信息。反射机制还提供了 ParameterizedType 接口、TypeVariable 接口等用于表示泛型类型参数的类型对象。
注:
方法getGenericSuperclass():
从一个Class对象中,获取该对象父类接收到的参数化类型(泛型);
方法getGenericInterfaces():
获取类的接口实现信息,返回实现接口信息的Type数组,包含泛型信息;
泛型是Java中一种推迟类型明确到运行时的技术,主要用于集合、类和接口,提供编译期的类型安全,避免类型转换。类型擦除是泛型的关键特性,编译后泛型参数会被转换为普通类型。桥方法保证了泛型类的继承正确性,而反射则允许在运行时获取泛型信息。
1121

被折叠的 条评论
为什么被折叠?



