`

Java泛型类型擦除后的补偿

阅读更多
    由于在使用泛型的时候,将会擦除类型参数,而只保留原始类型。所以在使用泛型时,我们不能使用new T(),也不能使用instanceof, 因为这两类操作要知道确切的类型。此问题的解决方案有三种(设计模式的使用):简单工厂(最简单),工厂方法(最灵活),模板方法(最简捷)。
1.简单工厂
在此方法中,将类型作为参数,以一个万能的工厂类(其中有一个返回具体类型类的实例的泛型方法)用类的newInstance()方法返回参数化类型的实例。
优点:简单,直接使用泛型方法
缺点:
(1)单一使用Class对象的newInstance()方法只能使用默认的构造器,使得对象的创建有限制。
(2)若一个具体的类无默认的构造器,则会抛出异常。
2.工厂方法
    与简单工厂方法相比,工厂方法加入了如下几个元素:
(1)工厂接口/抽象接口---具体工厂公共的接口/类型
(2)具体工厂-----由具体工厂负责具体产品的创建,且其必须保证产品的成功的创建,在具体工厂中可调用各种各样的构造方法,因为具体工厂中已将参数化类型具体化。
(3)工厂管理类------由此类可负责何种类型具体工厂的创建并可返回具体工厂的实例。
优点:加入了上述三个元素后,解决了以下问题:
1)所有的具体工厂拥有共同的接口
2)具体工厂保证了具体产品的成功创建:可调用任意的构造方法生成具体类的实例
3)工厂管理类:对具体工厂的生成拥有控制权,使具体工厂的生成具有了灵活性。
3.模板方法
    以更加简捷的方法生成具体类的实例。与工厂方法不同的地方在于:用模板类(抽象类)来控制整个实例化过程的流程(有点像工厂管理类,由模板方法控制整体流程,而具体创建过程由其子类实现),而由具体类来完成具体产品的构建。但在具体生成类的实例时,我还是用到了工厂的概念,但其只作为一个具体的实现而已。最大的优点:简捷,因为直接调用具体的生成类即可,并且模板类是隐藏的,对客户透明的(而工厂方法中管理类工厂要显式地生成)。

更多详细内容及三种方法的实现在附件中!!!



分享到:
评论

相关推荐

    Java 泛型擦除后的三种补救方法

    然而,Java 的泛型在运行时是被擦除的,这意味着在运行时刻,所有的泛型类型信息都会丢失,无法直接用来创建对象或进行类型检查。这导致我们无法使用 `new T()` 或 `instanceof` 这样的操作。为了解决这个问题,我们...

    解析Java泛型的类型擦除.pdf

    在 Java 语言中,泛型类型擦除的机制使得开发者难以理解和使用泛型,例如,在 Java 中,我们可以定义一个泛型类 `ArrayList<T>`,其中 `T` 是类型参数,但是,在编译后的字节码文件中,泛型类型信息已经被擦除,所有...

    Java泛型擦除深度解析:原理、影响与编程实践

    虽然这种机制带来了一些限制,如运行时类型错误、泛型类型参数不能是基本类型、无法创建泛型类型的实例、泛型类型参数不能使用instanceof、无法重载泛型方法等,但我们可以通过一些编程技巧来规避这些问题。...

    java 泛型类的类型识别示例

    综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...

    Java 泛型总结(一):基本用法与类型擦除

    "Java 泛型总结(一):基本用法与类型擦除" Java 泛型是 Java 语言中的一种强大功能,它可以使代码更加简洁、安全。下面是对 Java 泛型的基本用法和类型擦除机制的介绍。 泛型的基本用法 ------------- 泛型是...

    java泛型、原始类型、桥接方法

    桥接方法是 Java 编译器生成的特殊方法,用于解决泛型类型擦除后可能出现的类型不匹配问题。在编译时,编译器会生成桥接方法,以便在泛型类型擦除后,仍然能够保留类型安全性。 例如,假设我们有一个泛型类 Pair,...

    很好的Java泛型的总结

    Java泛型在编译期之后就会把类型给擦除,在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这就意味着,泛型只是对于编译期来说的,在执行期间是没有...

    关于C#、java泛型的看法

    另一方面,Java的泛型类型擦除带来了一定的灵活性,使得旧的无泛型代码能够与新的泛型代码兼容,这对于维护大型遗留项目尤其有利。然而,这也意味着Java开发者需要额外注意类型转换的安全性,避免出现...

    java泛型技术之发展

    - **类型擦除**:泛型信息在运行时不可用,无法在运行时获取泛型类型。 - **不能实例化类型参数**:如 `new T()` 是不允许的。 - **原始类型与泛型**:原始类型(如int、double)不能直接用作类型参数,但可以...

    Java泛型应用实例

    类型擦除是指在编译后,泛型信息会消失,生成的字节码中不包含泛型信息,这保证了与非泛型代码的兼容性。通配符如 `?` 和 `? extends SomeType` 用于增强泛型的灵活性,允许我们处理多种类型。边界如 `...

    java 泛型接口示例

    Java泛型在编译后会进行类型擦除,也就是说,所有的泛型信息在运行时都会消失。因此,虽然在编译期间我们能获得类型检查的好处,但在运行时,泛型接口和类的行为与无参数类型版本基本相同。 5. **通配符** 在某些...

    java泛型的内部原理及更深应用

    通过反射获取的类信息中,泛型类型将表现为原始类型,但在编译时,泛型信息可用于类型检查。 9. **集合框架中的泛型**:Java集合框架广泛使用了泛型,如ArrayList、LinkedList、HashMap等。使用泛型,可以确保集合...

    Java泛型与类型擦除

    “编译器会进行泛型擦除”是一个常识了(好吧,实际擦除的是参数和自变量的类型)。这个过程由“类型擦除”实现。但是并非像许多开发者认为的那样,在 <..> 符号内的东西都被擦除了。看下面这段代码: public ...

    java泛型深入.pdf

    首先,Java中的泛型允许定义方法、接口、类和变量时不指定具体的数据类型,而是在使用的时候再通过泛型类型参数来指定类型。泛型在JDK 1.5版本中引入。泛型避免了类型转换(Casting)的需要,比如以下示例代码: ``...

    Java泛型总结(2)进阶篇

    Java泛型在编译后会进行类型擦除,这意味着运行时无法获取到泛型的具体类型信息。所有的泛型类型在运行时都会被替换为其边界或Object。这解释了为什么我们不能在运行时通过反射检查一个对象是否属于某个泛型类型。 ...

    java 泛型方法使用示例

    需要注意的是,Java的泛型是通过类型擦除来实现的。这意味着在运行时,所有关于泛型的信息都会被删除,因此泛型只在编译时起作用。这也就意味着你不能在运行时通过反射获取到泛型的具体类型信息。 **七、总结** ...

Global site tag (gtag.js) - Google Analytics