为了有效地使用 Java 泛型,必须考虑以下限制:
- 无法实例化具有原始类型的泛型类型
- 无法创建类型参数的实例
- 无法声明类型为类型参数的静态字段
- 无法将 Casts 或 instanceof 与参数化类型一起使用
- 无法创建参数化类型的数组
- 无法创建,catch或引发参数化类型的对象
- 无法重载每个重载的形式参数类型擦除为相同原始类型的方法
考虑以下参数化类型:
创建对象时,不能用基本类型代替类型参数或:
您只能将非基本类型替换为类型参数和:
请注意,Java 编译器将到和''到自动装箱:
有关自动装箱的更多信息,请参阅数字和字符串类中的自动装箱和拆箱。
您不能创建类型参数的实例。例如,以下代码会导致编译时错误:
解决方法是,可以通过反射创建类型参数的对象:
您可以按以下方式调用方法:
类的静态字段是该类的所有非静态对象共享的类级别变量。因此,不允许使用类型参数的静态字段。考虑以下类别:
如果允许使用类型参数的静态字段,则以下代码将被混淆:
因为静态字段由,和共享,所以的实际类型是什么?不能同时是,和。因此,您不能创建类型参数的静态字段。
因为 Java 编译器会擦除通用代码中的所有类型参数,所以您无法验证在运行时使用的是泛型的参数化类型:
传递给方法的参数化类型为:
运行时不跟踪类型参数,因此无法区分和之间的区别。您最多可以做的是使用无界通配符来验证列表是否为:
通常,除非使用不受限制的通配符对其进行参数化,否则无法将其转换为参数化类型。例如:
但是,在某些情况下,编译器知道类型参数始终有效,并允许强制转换。例如:
您不能创建参数化类型的数组。例如,以下代码无法编译:
以下代码说明了将不同类型插入到数组中时发生的情况:
如果您对通用列表try相同的操作,则会出现问题:
如果允许使用参数化列表的数组,则先前的代码将无法抛出所需的。
通用类不能直接或间接扩展类。例如,以下类将无法编译:
方法无法catch类型参数的实例:
但是,您可以在子句中使用类型参数:
一个类不能有两个重载的方法,这些方法在类型擦除后将具有相同的签名。
重载将共享相同的类文件表示形式,并且将生成编译时错误。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/7438.html