这是一个java小白写的一篇关于泛型在分析与解惑,写这个博客是因为期末作业,写的不好或者分析的不到位请轻喷0.0,那接下来分析一下泛型。Java 泛型是 Java 语言的一个特性,它允许开发者在编写代码时指定类型参数,以提高代码的复用性和类型安全性。简单来说他就是一种Java的程序语言,那如何运用这个语言是我今天要分析的内容
泛型的好处
- 类型安全:编译时检查类型,避免类型转换错误。
- 代码复用:相同的代码可以用于不同的数据类型,减少代码冗余。
- 消除类型转换:减少不必要的类型转换,提高代码的可读性和可维护性。
泛型的使用场景
- 类和接口:定义泛型类或接口,使用类型参数代替具体的类型。
- 方法:定义泛型方法,允许方法接受不同类型的参数。
- 数组和集合:使用泛型定义数组和集合,确保元素类型的一致性。
泛型的语法
-
定义泛型类或接口:
public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
-
定义泛型方法:
public <T> void printArray(T[] array) { for (T item : array) { System.out.print(item + " "); } }
-
使用泛型数组和集合:
List<String> list = new ArrayList<String>(); Map<String, Integer> map = new HashMap<String, Integer>();
泛型的类型参数
- 非具体化类型:使用大写字母(如 T, E, K, V)作为类型参数的占位符。
- 有界类型参数:可以限制类型参数的上限或下限。
- 上限:
<T extends Number>
表示 T 必须是 Number 或其子类。 - 下限:
<T super Object>
表示 T 必须是 Object 或其超类。
- 上限:
泛型的类型擦除
- 类型擦除:Java 泛型在编译时存在,但在运行时被擦除,即类型参数被替换为 Object 类型。
- 类型擦除的影响:由于类型擦除,泛型类或接口的实例在运行时无法直接访问其类型参数。
泛型的通配符
- 无限制通配符:
?
表示任意类型。 - 有限制通配符:
? extends T
:表示 T 或 T 的子类。? super T
:表示 T 或 T 的超类。
泛型的注意事项
- 基本类型:泛型类型参数不能是基本类型(如 int, double),必须使用包装类(如 Integer, Double)。
- 静态上下文:静态上下文中不能使用泛型类型参数。
- 协变与逆变:泛型不支持协变和逆变,即不能将
List<Number>
赋值给List<Integer>
。
泛型的高级特性
- 泛型方法的继承:子类可以继承父类的泛型方法。
- 泛型方法的重载:可以重载泛型方法,但需要注意类型参数的一致性。
以上是关于java的相关简单分析,如果觉得难,我们分析一下一个简单的案例
private static <T> void inputContent(T t){ System.out.println("打印传入的数据:"+t); }
public static void main( String args[] ){ inputContent("String"); inputContent(123); }
以上程序中前面第一条定义了一个泛型类,第二个程序就是调用了这个泛型,一个很简单的程序调用,调用inputcontent处理数据输出。
定义泛型类
泛型类通过在类名后面添加类型参数来定义。类型参数通常用单个大写字母表示,如 T、E、K、V 等
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
在这个例子中,Box
是一个泛型类,T
是类型参数,可以是任何类型。
使用泛型类
创建泛型类的实例时,你需要指定类型参数的实际类型。
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello, World!");
String content = stringBox.getContent();
在这个例子中,Box
类的实例 stringBox
被指定为存储 String
类型的对象。
Java 使用类型擦除来实现泛型,这意味着在运行时,所有的类型参数都会被擦除,被替换为它们的限定类型或 Object
类型。因此,泛型类在运行时不会保留其类型参数信息。
泛型类的字段
泛型类的字段必须是其类型参数的类型或其子类型。
public class Box<T> {
private T item; // 正确
private List<T> items; // 正确
private List rawItems; // 错误,不能直接使用原始类型
}
泛型类的方法
泛型类可以定义普通方法和泛型方法。
- 普通方法:方法的参数和返回类型可以是类型参数或其具体化类型。
- 泛型方法:在类内部定义的泛型方法,具有自己的类型参数。
public class Utils { public <T> void printArray(T[] array) { for (T item : array) { System.out.println(item); } } }
定义出一个具有自己的类型参数
-
当使用泛型类作为另一个类的字段或方法参数时,可以使用通配符代替具体的类型参数。
public class Warehouse { private List<Box<?>> boxes; // 存储不同类型的 Box 实例 }
泛型类的数组
Java 不允许直接实例化泛型数组,因为数组在 Java 中是协变的,而泛型是不可协变的。
-
Box<T>[] boxes = new Box<T>[10]; // 错误,不能这样使用 Box<T>[] boxes = (Box<T>[]) new Box<?>[10]; // 错误,不安全转换
正确的编写格式才能正确运行,或者说按照要求处理数据
-
以上就是一个小白来自Java泛型的部分分析和分享,还有的部分我就分析不到了,在学习泛型语句的过程中我遇到了不少麻烦,后面发现还蛮有趣的,谢谢大家观看。