2026/1/24 18:40:44
网站建设
项目流程
鄠邑区建设和住房保障局网站,门户网站时代,wordpress后台改密码,太原网站建设山西悉云科技1.泛型类的定义泛型类是Java中一种可以参数化的类#xff0c;它允许在定义类时不指定具体的类型#xff0c;而是在实例化时再确定具体的类型参数。这种机制提高了代码的复用性和类型安全性。1.1基本语法泛型类的定义语法class 类名称 泛型标识、泛型标识#xff0c;...它允许在定义类时不指定具体的类型而是在实例化时再确定具体的类型参数。这种机制提高了代码的复用性和类型安全性。1.1基本语法泛型类的定义语法class 类名称 泛型标识、泛型标识... { private 泛型标识 变量名 ...... }常用的泛型标识T、E、K、V其中T表示类型参数声明T是类型参数名可以是任何有效的标识符但通常使用单个大写字母可以在类定义中使用T作为实际的类型1.2 示例代码 /** * 泛型类的定义 * param T 泛型标识-----类型形参 * T 创建对象的时候里面具体制定的数据类型 */ public class GenericT { // T 是由外部使用类的时候来指定的。 private T key; public Generic(T key) { this.key key; } public T getKey() { return key; } public void setKey(T key) { this.key key; } Override public String toString() { return Generic{ key key }; } } 1.3 使用场景容器类如集合框架中的ArrayList、HashMap等工具类如比较器Comparator数据包装类如Optional自定义数据结构如树、图等通用数据结构1.4 多类型参数泛型类可以定义多个类型参数public class PairK, V { private K key; private V value; public Pair(K key, V value) { this.key key; this.value value; } // getter和setter方法 }1.5 类型参数约束可以使用extends关键字对类型参数进行约束public class NumberBoxT extends Number { private T number; public double getDoubleValue() { return number.doubleValue(); } }1.6 注意事项泛型类不能是基本数据类型如int、char等类型擦除Java泛型是通过类型擦除实现的运行时类型信息会被擦除静态成员不能使用类型参数不能实例化类型参数如new T()是不允许的2. 泛型类的使用语法泛型类是Java中实现参数化类型的重要机制它允许在定义类时指定类型参数在使用时再确定具体类型。以下是泛型类的详细使用说明2.1. 泛型类的定义使用语法类名具体的数据类型 对象名 new 类名具体的数据类型();java 1.7以后后边的中具体的数据类型可以省略不写类名具体的数据类型 对象名 new 类名();2.2 案例public static void main(String[] args) { // 泛型类在创建对象的时候来指定操作的具体数据类型 GenericString stringGeneric new Generic(a); String key stringGeneric.getKey(); System.out.println(key: key); System.out.println(------------------------); GenericInteger integerGeneric new Generic(100); Integer key1 integerGeneric.getKey(); System.out.println(key1:key1); // 总结泛型的本质是参数化类型也就是所操作的数据类型被指定为一个参数。 System.out.println(----------注意点1--------------); // 泛型类在创建对象的时候没有指定泛型类将按照Object类型来操作 Generic generic new Generic(ABC); Object key3 generic.getKey(); System.out.println(key3:key3); System.out.println(----------注意点2--------------); // 泛型类不支持基本数据类型原因就是我们在编译期间会将这个 T 编译成 Object // 基本数据类型无法转化为 object类型 // Genericint intGeneric new Generic(100); System.out.println(----------注意点3--------------); // 同一泛型类根据不同的数据类型创建的对象本质上是同一类型 System.out.println(integerGeneric.getClass() stringGeneric.getClass()); }总结泛型类使用要点未指定具体数据类型时操作类型默认为Object类型参数仅支持类类型不支持基本数据类型逻辑上可视为不同类型但实际运行时属于同一类型年终抽奖器可能会是奖金也可能是奖品/** * 抽奖器 * param T */ public class ProductGetterT { //奖金或者奖品 private T product; // 定义奖品、奖金池 ArrayListT arrayList new ArrayList(); // 添加奖品到奖品池 public void addProduct(T t){ arrayList.add(t); } // 定义一个随机数用来抽选奖品 Random random new Random(); //抽奖 public T getProduct(){ product arrayList.get(random.nextInt(arrayList.size())); return product; } }public static void main(String[] args) { ProductGetterString stringProductGetter new ProductGetter(); String[] strPro {苹果手机,华为手机,扫地机器人,咖啡机}; //将奖品放入奖金池 for (int i 0;i strPro.length;i){ stringProductGetter.addProduct(strPro[i]); } String product stringProductGetter.getProduct(); System.out.println(恭喜您抽中了product); System.out.println(******************************); ProductGetterInteger IntegerProductGetter new ProductGetter(); Integer[] intPro {100,1000,10000,20000}; //将奖品放入奖金池 for (int i 0;i intPro.length;i){ IntegerProductGetter.addProduct(intPro[i]); } Integer product1 IntegerProductGetter.getProduct(); System.out.println(恭喜您获的了product1元); }3. 从泛型类派生子类2种情况子类也是泛型类子类和父类的泛型类型要保持一致class ChildGenericT extends GenericT子类不是泛型类父类要明确泛型类的数据类型class ChildGeneric extends GenericString第一种情况子类和父类的泛型类型要保持一致定义父类public class ParentE { private E value; public E getValue() { return value; } public void setValue(E value) { this.value value; } }定义子类/** * 泛型类派生子类如果子类也是泛型类子类的泛型标识要和父类一致。 * param T */ public class ChildFirstT extends ParentT { Override public T getValue() { return super.getValue(); } }测试类public static void main(String[] args) { ChildFirstString childFirst new ChildFirst(); childFirst.setValue(123); String value childFirst.getValue(); System.out.println(value); }第二种情况子类没有使用 泛型总结子类不是泛型类父类要明确泛型类的数据类型4. 泛型接口4.1 泛型接口的语法定义interface 接口名称 泛型标识泛型标识,...{ 泛型标识 方法名(); ...... }4.2 泛型接口的使用2种情况情况1实现类不是泛型类接口要明确数据类型当实现类不是泛型类时需要在实现接口时明确指定具体的数据类型。这种情况下接口的泛型参数会被具体化为特定的类型。示例// 泛型接口定义 interface DataContainerT { void add(T item); T get(int index); } // 非泛型实现类 class StringContainer implements DataContainerString { private ListString items new ArrayList(); Override public void add(String item) { items.add(item); } Override public String get(int index) { return items.get(index); } }应用场景当实现类只需要处理特定类型数据时例如专门处理字符串、整数等具体类型的容器类可以避免在实现类中使用泛型带来的复杂性情况2实现类也是泛型类实现类和接口的泛型类型要一致当实现类也是泛型类时实现类的泛型参数必须与接口的泛型参数保持一致这样才能确保类型安全。示例// 泛型接口定义 interface DataContainerT { void add(T item); T get(int index); } // 泛型实现类 class GenericContainerT implements DataContainerT { private ListT items new ArrayList(); Override public void add(T item) { items.add(item); } Override public T get(int index) { return items.get(index); } }应用场景当需要创建通用的、可重用的组件时例如集合框架中的ArrayList、LinkedList等可以保持代码的灵活性和可扩展性注意事项实现类的泛型参数名可以与接口不同但类型参数数量必须一致可以在实现类中添加额外的泛型参数类型擦除后编译器会确保类型安全