java范型
‘壹’ java 泛型中通配符详解
在探讨Java泛型的通配符时,首先需理解其基本概念。通配符主要分为三类:无边界的通配符、固定上边界的通配符以及固定下边界的通配符。
无边界的通配符,如List ? >,用于允许泛型接受任何未知类型的对象。固定上边界的通配符,如List E >,则允许泛型接受特定类及其子类的类型数据。同样地,固定下边界的通配符允许接受特定类及其父类的类型数据。
在实际使用中,如果定义方法打印任意参数化类型的集合中的数据,通常会遇到错误提示。这是因为泛型参数不考虑继承关系。这时,可以利用通配符?来解决。在方法定义中使用?通配符,可以允许调用与参数化类型无关的方法,例如集合的大小等信息。然而,?通配符定义的变量只能调用与参数化类型无关的方法,不能调用与参数化有关的方法。
?通配符的使用还涉及其上边界和下边界的界定。类型1指定的数据类型决定了类型2可以是类型1、类型1的子类或父类,取决于是否界定上边界或下边界。需要注意的是,限定通配符总是包括自身。
在使用通配符时,应遵循几个基本原则,通常被称为PECS(Procer Extends, Consumer Super)原则,即“生产者使用extends,消费者使用super”。这原则指导我们在集合中使用泛型时,如何正确地使用通配符以确保代码的正确性和安全性。
总结而言,Java泛型中的通配符是处理类型安全和灵活性的有力工具。通过理解其基本概念、使用规则以及在实际代码中的应用,可以有效地利用通配符来解决类型兼容性和继承性问题,从而编写出更加灵活且易于维护的Java代码。
‘贰’ java基础-反射和泛型
Java基础反射和泛型反射核心概念:
- 获取Class对象:通过三种方式获取,最终指向的都是同一对象,用于访问类的属性和方法。
- 调用私有构造方法:通过获取Constructor实例并调用对应构造函数实现。
- 使用私有成员:通过Field实例获取访问权限,调用get或set方法实现读取与修改。
- 访问私有成员方法:通过Method实例调用对应方法实现。
优点:
- 动态性:允许在运行时获取类的信息并调用方法。
- 灵活性:提供了强大的动态操作能力。
- 泛型操作:可以动态地处理不同类型的对象。
缺点:
- 性能开销:反射操作相比直接调用方法有一定的性能损耗。
- 安全风险:可能破坏封装性,访问私有成员和方法。
- 可读性降低:代码中使用反射可能降低代码的可读性和可维护性。
使用建议:在性能敏感场景下应谨慎使用反射,权衡其带来的灵活性与性能开销。
核心概念:
- 泛型类:定义泛型参数,用户在使用时明确具体类型,实现类型安全。
- 泛型方法:仅在特定方法上使用泛型参数,适用于不关心类其他属性的情况。
- 泛型类的子类:可以继承或实现泛型类,子类可以明确泛型类的类型参数,也可以不明确。
- 类型通配符:如List<?>,表示元素类型未知的集合,可以匹配任何类型的元素,但添加元素时需注意类型安全。
- 泛型上限和下限:定义了类中泛型参数的边界,确保类型约束。
类型擦除:
- 在JDK 1.5之前,为了与旧版本代码兼容,泛型信息在编译时被擦除,生成的字节码文件不包含泛型信息。
- 桥接方法:由编译器自动生成,用于确保泛型方法的字节码兼容性,可以通过isBridge方法判断。
优点:
- 类型安全:通过泛型参数化类、方法及变量,确保类型一致,避免强制类型转换错误。
- 代码复用:泛型代码可以处理不同类型的数据,提高了代码的复用性。
使用建议:合理利用泛型机制,确保代码的类型安全和可读性。