目录
概述
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博客