泛型在Java中的应用

柔情只为你懂 2024-03-31 16:35 164阅读 0赞

目录

1、泛型

2、泛型类

3、泛型接口

3.1、实现类中对接口的泛型指定具体包装类

3.2、实现类中依然使用泛型

4、泛型方法

5、泛型通配

6、泛型方法中的可变参数

7、泛型对象限制


1、泛型

作用于编译时用于对象类型检查,运行时不起作用。

泛型的声明在一对尖角括号中 <>,泛型名称可以是任意字母。

2、泛型类

用于类中,在类名末尾对泛型进行声明;

在对该类进行实例化时,需要将泛型指定为具体的包装类,此时,在实例化泛型类时,就可以起到编译时检查的作用。

  1. public class TestGeneric<M> {
  2. private M t;
  3. public TestGeneric(M t){
  4. this.t = t;
  5. }
  6. public M getT() {
  7. return t;
  8. }
  9. public void setT(M t) {
  10. this.t = t;
  11. }
  12. public static void main(String[] args) {
  13. TestGeneric<Integer> generic = new TestGeneric<>(12);
  14. generic.setT(251);
  15. System.out.println(generic.getT());
  16. }
  17. }

3、泛型接口

用于接口中,在接口名末尾对泛型进行声明;

  1. public interface GenericInterface<T> {
  2. T getName(T t);
  3. }

当对该接口创建实现类时,有两种方式

3.1、实现类中对接口的泛型指定具体包装类

  1. class GenericImpl implements GenericInterface<String>{
  2. @Override
  3. public String getName(String s) {
  4. return s;
  5. }
  6. public static void main(String[] args) {
  7. GenericInterface<String> generic = new GenericImpl();
  8. String sss = generic.getName("sss");
  9. }
  10. }

3.2、实现类中依然使用泛型

在实现类中依然使用泛型,但需要在实现类名的后边,对泛型进行重新声明

  1. class GenericImpl2<T> implements GenericInterface<T>{
  2. @Override
  3. public T getName(T t) {
  4. return t;
  5. }
  6. public static void main(String[] args) {
  7. GenericInterface<Integer> g2 = new GenericImpl2<>();
  8. Integer name = g2.getName(12);
  9. System.out.println(name);
  10. }
  11. }

4、泛型方法

无论是静态方法还是普通方法,在方法声明中,都必须对泛型进行声明;

  1. public class GenericMethod {
  2. //无返回值
  3. public <T> void getName(T t){
  4. System.out.println(t);
  5. }
  6. //有返回值
  7. public <T> T getAge(T t){
  8. return t;
  9. }
  10. //静态方法,泛型需要在方法声明中定义
  11. public static <T> void getUser(T t){
  12. System.out.println("static");
  13. }
  14. public static void main(String[] args) {
  15. GenericMethod gm = new GenericMethod();
  16. gm.getName("张三");
  17. Integer age = gm.getAge(123);
  18. System.out.println(age);
  19. getUser('A');
  20. }
  21. }

5、泛型通配

当对泛型类型不确定时,也可以使用 <?> 声明为类型可变的泛型,以增加泛型的灵活适配。

  1. public class NormalGeneric {
  2. //泛型中的通配符
  3. public void showMsg(TestGeneric<?> generic){
  4. System.out.println(generic.getT());
  5. }
  6. public static void main(String[] args) {
  7. NormalGeneric normalGeneric = new NormalGeneric();
  8. TestGeneric<Integer> g1 = new TestGeneric<>(123);
  9. normalGeneric.showMsg(g1);
  10. TestGeneric<String> g2 = new TestGeneric<>("abc");
  11. normalGeneric.showMsg(g2);
  12. }
  13. }

6、泛型方法中的可变参数

当泛型方法中的参数不固定时,也可以使用可变参数的写法,来定义泛型方法。

  1. public class NormalGeneric {
  2. //泛型方法中的可变参数
  3. public <T> void showMsg(T ... args){
  4. for (T t : args) {
  5. System.out.println(t);
  6. }
  7. }
  8. public static void main(String[] args) {
  9. NormalGeneric normalGeneric = new NormalGeneric();
  10. normalGeneric.showMsg("hello", "world", "java");
  11. normalGeneric.showMsg(1, 3, 5);
  12. }
  13. }

7、泛型对象限制

上限限定:使用 泛型通配符 ? + extends 关键字,指明该泛型只能使用约定类型及其子类型;

下限限定:使用 泛型通配符 ? + super 关键字,指明该泛型只能使用约定类型及其父类型。

  1. public class NormalLimit {
  2. //泛型类型,通配符的上限限定,只能使用约定类型及其子类型
  3. public void highLimit(TestGeneric<? extends Number> number){
  4. System.out.println(number);
  5. }
  6. //泛型类型,通配符的下限限定,只能使用约定类型及其父类型
  7. public void lowLimit(TestGeneric<? super Number> number){
  8. System.out.println(number);
  9. }
  10. public static void main(String[] args) {
  11. NormalLimit n = new NormalLimit();
  12. TestGeneric<Integer> t = new TestGeneric<>(123);
  13. TestGeneric<Number> t2 = new TestGeneric<>(123);
  14. TestGeneric<Object> t3 = new TestGeneric<>("abc");
  15. n.highLimit(t2);
  16. n.highLimit(t);
  17. //n.highLimit(t3); //上限限定,不能使用父类型
  18. //n.lowLimit(t); //下限限定,不能使用子类型
  19. n.lowLimit(t2);
  20. n.lowLimit(t3);
  21. }
  22. }

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java应用

    Java中泛型的定义 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义) 在程序编码中一些包含参数的类。其参