Java 为什么使用泛型

目录

概述

1. 如下我们需要不同对象打印内容

2. 这时候就可以引入泛型使用

3. 泛型和Object的区别 


概述

Java泛型(Generics)是JDK5.0引入的一种特性,它允许程序员在定义类、接口和方法时使用类型参数(type parameters)。这些类型参数在实例化时(如创建对象或调用方法时)会被具体的类型(如int、String等)所替代。泛型的主要目的是在编译时提供类型安全,并在运行时保持类型信息。

1. 如下我们需要不同对象打印内容

package com.mycompany.printer;

public class IntegerPrinter {
    private Integer content;
    public IntegerPrinter(Integer content){
        this.content = content;
    }
    public void print(){
        System.out.println(content);
    }
}
package com.mycompany.objectcpgeneric;

public class PrinterObj {
    private Object content;
    public PrinterObj(Object content){
        this.content = content;
    }
    public void print(){
        System.out.println(content);
    }
}
    public static void main(String[] args) {
        IntegerPrinter integerPrinter = new IntegerPrinter(123);
        integerPrinter.print();
        StringPrinter stringPrinter = new StringPrinter("I am string");
        stringPrinter.print();
    }

/* 运行结果
123
I am string
*/ 

显然如果我们需要的打印的对象越来越多,就需要建立更多对应的打印类,这样是其实有很多的重复代码,有任何需求更新将来会越来越难以统一管理。

2. 这时候就可以引入泛型使用

package com.mycompany.objectcpgeneric;

public class PrinterGen<T> {
    private T content;
    public PrinterGen(T content){
        this.content = content;
    }
    public void print(){
        System.out.println(content);
    }
}
    public static void main(String[] args) {
        PrinterGen<Integer> printerGen = new PrinterGen<>(123);
        printerGen.print();
        PrinterGen<String> printerGen2 = new PrinterGen<>("I am string");
        printerGen2.print();
    }

/* 运行结果
123
I am string
*/

3. 泛型和Object的区别 

如1.2中我们使用泛型,为什么不直接使用Object呢?如下我们使用Object去创建这个公共的打印类。

package com.mycompany.objectcpgeneric;

public class PrinterObj {
    private Object content;
    public PrinterObj(Object content){
        this.content = content;
    }
    public void print(){
        System.out.println(content);
    }
}
    public static void main(String[] args) {
        PrinterObj printerObj = new PrinterObj(123);
        printerObj.print();
        PrinterObj printerObj2 = new PrinterObj("I am string");
        printerObj2.print();
    }

 /* 运行结果
123
I am string
*/

可以看到Object和泛型的打印效果其实是一样的。
Java有了Object为什么还需要泛型呢?

泛型(Generics)其实是JDK5.0才引入的特性。Java在之前,已经存在Object类,并且所有的类都是Object类的直接或间接子类。然而,Object类作为所有类的“根”,其提供的功能非常基础,例如equals(), hashCode(), toString(), clone(), notify(), notifyAll(), wait(), finalize(), 和 getClass() 等。尽管使用Object类可以在一定程度上实现多态和动态类型,但在处理集合(如List、Set、Map等)时,使用Object类型会带来一些问题:

  • 类型安全性问题:当你从集合中取出元素时,你需要显式地将其转型为你期望的类型。如果转型失败(例如,你期望得到一个String,但实际上集合中存储的是一个Integer),那么在运行时将会抛出ClassCastException。
  • 代码冗余:由于需要在取出元素时进行显式的转型,这会导致代码冗余和潜在的错误。
  • 性能问题:虽然现代JVM对于类型检查和转型操作已经做了优化,但在某些情况下,使用泛型可以避免不必要的类型检查和转型操作,从而提高性能。

泛型的主要优点包括:

  • 类型安全:使用泛型可以确保在编译时检查类型的安全性,从而避免了在运行时抛出ClassCastException。可以设置泛型界限bounded generics。将错误提前到编译阶段发现,而不是运行阶段,有助于让我们提前发现错误。
  • 代码重用和简化:通过定义泛型类和泛型方法,你可以编写更加通用和可重用的代码。此外,由于不需要进行显式的转型操作,代码也会更加简洁。
  • 更好的性能:在某些情况下,使用泛型可以避免不必要的类型检查和转型操作,从而提高性能。
  • 通过使用泛型,可以使用父类的资源。

泛型使用可参考
Java 泛型基础-CSDN博客

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值