当前位置: 首页 > news >正文

素马网站制作开发网站很难被百度收录

素马网站制作开发,网站很难被百度收录,微网站摇一摇,做电池网站的引导页一、泛型擦除概述 1.1 定义与核心原理 泛型擦除是Java泛型实现的重要特性,指在编译阶段将泛型类型信息(类型参数)从字节码中移除的过程。Java的泛型是“编译期语法糖”,在运行时不保留泛型类型参数,所有泛型类型都会被…

一、泛型擦除概述

1.1 定义与核心原理

泛型擦除是Java泛型实现的重要特性,指在编译阶段将泛型类型信息(类型参数)从字节码中移除的过程。Java的泛型是“编译期语法糖”,在运行时不保留泛型类型参数,所有泛型类型都会被转换为原始类型(Raw Type)。

核心原理:

  • 编译时,编译器会检查泛型类型的使用是否合法(如类型匹配、边界约束)。
  • 编译后,字节码中不再包含泛型类型参数,统一替换为其原始类型(无泛型的基础类型)。
  • 运行时,虚拟机无法区分Container和Container,两者都被视为Container类型。

1.2 泛型擦除示例

1.2.1 泛型类的擦除

// 编译前:泛型类
public class Container<T> {private T data;public T getData() { return data; }public void setData(T data) { this.data = data; }
}// 编译后:泛型擦除为原始类型(T被替换为Object)
public class Container {private Object data;public Object getData() { return data; }public void setData(Object data) { this.data = data; }
}

1.2.2 带边界的泛型类擦除

// 编译前:带上限的泛型类
public class NumberContainer<T extends Number> {private T data;public T getData() { return data; }
}// 编译后:T被替换为上限类型Number
public class NumberContainer {private Number data;public Number getData() { return data; }
}

在这里插入图片描述

1.3 泛型擦除的影响

  1. 运行时类型信息丢失
    无法通过getClass()区分泛型实例的具体类型,例如:

    Container<Integer> intContainer = new Container<>();
    Container<String> strContainer = new Container<>();
    // 运行时两者类型相同,均为Container.class
    System.out.println(intContainer.getClass() == strContainer.getClass()); // true
    
  2. 类型转换的隐式插入
    编译器在泛型方法调用处自动插入类型转换代码,确保类型安全:

    // 编译前:无显式转换
    Integer data = intContainer.getData();// 编译后:编译器自动添加转换
    Integer data = (Integer) intContainer.getData();
    
  3. 不能用泛型类型创建实例
    运行时无法获取泛型类型参数,因此new T()等语法不允许:

    public <T> void createInstance() {T obj = new T(); // 编译报错:无法确定T的具体类型
    }
    

二、边界限定

2.1 定义与作用

边界限定是通过extends或super关键字限制泛型类型参数的范围,确保泛型类型满足特定条件(如继承某个类或实现某个接口)。其核心作用是:

  • 增强类型安全:避免传入不兼容的类型(如限制泛型只能是数值类型)。
  • 扩展泛型功能:允许在泛型代码中调用边界类型的方法(如调用Number的intValue())。

2.2 上限限定(extends)

2.2.1 语法与定义

上限限定用extends关键字,限制泛型类型参数必须是指定类型或其子类(包括指定类型本身)。语法格式:

// 类级上限限定
class 类名<T extends 边界类型> { ... }// 方法级上限限定
public <T extends 边界类型> 返回值类型 方法名(T 参数) { ... }

边界类型可以是类或接口,若为接口可指定多个(用&分隔,类必须放在第一个):

// T必须是Number的子类且实现Comparable接口
class DataHandler<T extends Number & Comparable<T>> { ... }

2.2.2 示例:数值计算工具类

// 泛型类:T必须是Number的子类(如Integer、Double)
class NumberCalculator<T extends Number> {// 计算两个数值的和public double sum(T a, T b) {// 可调用Number的方法(因T上限为Number)return a.doubleValue() + b.doubleValue();}
}public class BoundsDemo {public static void main(String[] args) {// 合法:Integer是Number的子类NumberCalculator<Integer> intCalc = new NumberCalculator<>();System.out.println(intCalc.sum(1, 2)); // 3.0// 合法:Double是Number的子类NumberCalculator<Double> doubleCalc = new NumberCalculator<>();System.out.println(doubleCalc.sum(1.5, 2.5)); // 4.0// 非法:String不是Number的子类// NumberCalculator<String> strCalc = new NumberCalculator<>(); // 编译报错}
}

在这里插入图片描述

2.3 下限限定(super)

2.3.1 语法与定义

下限限定用super关键字,限制泛型类型参数必须是指定类型或其父类(包括指定类型本身)。语法格式:

// 方法级下限限定(类级一般不使用super)
public <T super 边界类型> 返回值类型 方法名(T 参数) { ... }

2.3.2 示例:数据存储工具类

// 工具类:向容器存储Integer相关类型数据
class DataSaver {// T必须是Integer或其父类(如Number、Object)public static <T super Integer> void save(T data, Container<T> container) {container.setData(data);}
}public class SuperBoundsDemo {public static void main(String[] args) {// 合法:Integer是下限类型Container<Integer> intContainer = new Container<>();DataSaver.save(100, intContainer);// 合法:Number是Integer的父类Container<Number> numContainer = new Container<>();DataSaver.save(200, numContainer);// 非法:String不是Integer的父类// Container<String> strContainer = new Container<>();// DataSaver.save(300, strContainer); // 编译报错}
}

2.4 边界限定与泛型擦除的关系

边界限定直接影响泛型擦除的结果:

  • 无边界限定:擦除后类型参数替换为Object(如Container→Container)。
  • 上限限定:擦除后类型参数替换为上限类型(如NumberCalculator→NumberCalculator)。
  • 下限限定:擦除后类型参数仍替换为Object(下限限定不影响擦除后的原始类型)。

这种机制确保擦除后的代码仍能调用边界类型的方法(如Number的doubleValue()),维持泛型代码的功能正确性。

三、泛型擦除与边界限定的最佳实践

3.1 合理使用边界限定增强安全性

  • 当泛型代码需要调用特定类型的方法时,使用上限限定(如T extends Number确保可调用数值方法)。
  • 当需要向泛型容器写入特定类型数据时,使用下限限定(如T super Integer确保容器能接收整数)。

3.2 避免泛型擦除导致的常见问题

  1. 不要依赖运行时泛型类型判断
    用instanceof或getClass()无法区分泛型实例类型,需通过其他方式(如额外存储类型标记)解决。

  2. 通过反射规避实例创建限制
    若需创建泛型类型实例,可通过反射传入Class对象:

    public <T> T createInstance(Class<T> clazz) throws Exception {return clazz.newInstance(); // 通过Class对象创建实例
    }
    
  3. 明确泛型数组的使用限制
    不能直接创建泛型数组(如new T[10]),可使用通配符数组或Object数组转换:

    T[] array = (T[]) new Object[10]; // 需显式转换,注意类型安全
    

3.3 边界限定的常见误区

  1. 混淆extends和super的适用场景
    extends适合读取数据(生产者),super适合写入数据(消费者),遵循PECS原则(Producer Extends, Consumer Super)。

  2. 过度使用无边界泛型
    无边界泛型(T)擦除后为Object,需频繁类型转换,降低效率且易出错,优先使用有边界限定的泛型。

四、总结

泛型擦除和边界限定是Java泛型的核心机制:

  • 泛型擦除:编译期移除泛型类型信息,确保与老版本Java兼容,运行时泛型类型统一为原始类型,但编译器会自动插入类型转换保证安全。
  • 边界限定:通过extends和super限制泛型类型范围,增强代码安全性,同时影响泛型擦除结果,确保擦除后仍能调用必要方法。

理解两者的工作原理和关联关系,能帮助开发者编写更安全、高效的泛型代码,避免因擦除导致的类型问题,充分发挥泛型的灵活性和复用性。

http://www.dtcms.com/a/530174.html

相关文章:

  • 解密数学建模中的灵敏度分析
  • 去哪个网站做农产品推广自然资源部网站绿色矿山建设
  • 山西省住房和城乡建设厅官方网站零基础网页设计制作培训
  • 广州红盾信息门户网站楼市最新消息今天
  • 网站qq启动链接怎么做悦然wordpress建站服务
  • 想学网站开发免费推广网店
  • 分层系统异常处理的原则(转)
  • 进一步推进网站集约化建设邯郸网站建设联系电话
  • 郴州58网站wordpress 郁思注意
  • 南通网站定制哪家好网站的建设包括
  • 外链生成网站app开发app制作公司
  • 免费网站建设服务安阳县县长
  • InitTermSrv函数中的WinStationInitLPC和WinStationInitRPC函数
  • 南宁网站推广营销网页制作与网站建设试卷
  • 平邑做网站的最近火爆的新闻大事
  • 我有网网站建设做网站有哪个软件好
  • 可信网站的作用建站软件移动版
  • 国外域名。国内网站南宁seo推广外包
  • 专业建站公司wordpress多条件筛选
  • 交易平台网站建设策划书手机访问不了wordpress
  • 自己建网站 怎么做后台邵阳哪里做网站
  • 藏文识别技术:数字时代的文化桥梁
  • 杭州网站制作工具买空间送网站模板
  • wordpress建什么站恩施建站建设
  • 江苏省网站备案湖南郴州旅游十大必去景区
  • 2025年9月电子学会全国青少年软件编程等级考试(scratch图形化二级)真题及答案
  • 【Shell】传递参数
  • 国外做节目包装的网站自助建站模板
  • 优秀个人网站设计图片劲松网站建设公司
  • 黄山网站建设黄山编程培训班学费是多少