您的位置 首页 java

泛型的3种使用方式:泛型类、泛型接口、泛型方法

泛型的3种使用方式:泛型类、泛型接口、泛型方法

泛型 是一种特殊的类型,我们可以把 泛型 应用在类、接口、方法上,来实现一些通用算法;在确定类型变量这一步中,可以使用 泛型通配符 来限制泛型的范围,来实现一些特殊算法。

上一篇介绍 “ ”,本篇,我们就来 深入泛型的3种使用方式:泛型类、泛型接口、泛型方法

泛型学习资料:《泛型最全知识导图》、《大厂泛型面试真题26道》,到本篇结尾处获得~

1 泛型的使用步骤

泛型的主要使用步骤:

1.1 定义类型变量

1.2 使用类型变量

1.3 确定类型变量

PS.

如果对 “ ” 还不是很清楚,可以点击 蓝字 温顾下,结合本篇一起看。

2 泛型的三种使用方式

泛型的三种使用方式:

  • 泛型类
  • 泛型接口
  • 泛型方法

下面,我们用源码实例逐一详解。

2.1 泛型类

2.1.1 泛型类的定义

泛型类, 是在 实例化类时 指明泛型的具体类型,是拥有泛型特性的类,本质还是一个 Java 类,可以被继承。

泛型类是最常见的泛型使用方式,最常见的运用就是各种集合类和接口,例如List、ArrayList 等。

2.1.2 泛型类的格式

格式: public class 类名<数据类型,…> { }

示例: public class Generic <T>{ }

关于数据类型:

  • 可以用任意字母来代表,例如 T ,或者 T,E,K,V等形式的参数。
  • 也可以用多个英文字母,如果用多个英文字母,需要用逗号隔开,例如 public class Generic<T,K,V>{ } 。

2.1.3 泛型类的使用

  • 定义一个类,在该类名后面添加类型参数声明部分,由尖括号分隔;
  • 每一个类型参数声明部分,可以包括一个或多个类型参数,参数间用逗号隔开;
  • 使用 <T> 来声明一个类型持有者名称,将 T 当作一个类型来声明成员、参数、返回值类型(此处T可以写为任意标识)。

2.1.4 泛型类的示例代码

泛型类:

 public class GenericsBox<T> {
     private  T t;
 
    public  void  add(T t) {
        this.t = t;
    }
 
    public T get() {
        return t;
    }
}  

泛型类调用:

 GenericsBox< integer > integerGenericsBox = new GenericsBox<>(); 
GenericsBox<String> stringGenericsBox = new GenericsBox<>(); 

 Integer GenericsBox.add(new Integer(25)); 
 String GenericsBox.add(new String("年龄")); 
LogUtil.e("泛型类调用", stringGenericsBox.get() + ":" + integerGenericsBox.get());  

只要类中操作的引用数据类型不确定,就可以定义泛型类。

通过使用泛型类,可以省去 强制类型转换 的类型转换异常的麻烦。

2.1.5 泛型类的使用注意事项

  • 泛型的类型参数(包括自定义类),只能是类类型(String、Integer),不能是简单类型(int,double);
  • 不能对确切的泛型类型使用 instanceof 操作,会导致编译时出错。
  • 使用泛型时,如果传入泛型实参,会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用;如果不传入泛型类型实参,在泛型类中,使用泛型的方法或成员变量定义的类型,可以是任何的类型。
  • 若泛型类型已确定,则只能是其本身,其子类不能使用。

2.2 泛型接口

2.2.1 泛型接口的定义

将泛型用在接口 interface 上,被称为 泛型接口 泛型接口 经常被用在各种类的生产器中。

2.2.2 泛型接口的格式

格式:修饰符 interface 接口名 <类型>{ }

示例: public interface ShangHaiJieKou<T> { }

泛型接口格式,类似于泛型类的格式;接口中的方法的格式,类似于泛型方法的格式。

 以下有两个类,和一个接口,我们以接口类为例:

1.Genericimpl(接口实现类)

2.Generic_泛型接口<T>(interface接口类)

3.GenericDemo_泛型接口(main方法实现类)  

2.2.3 泛型接口的使用

  • 定义一个接口,在该接口名后面,添加类型参数声明部分,用尖括号分隔。
  • 每一个类型参数声明部分,可以包括一个或多个类型参数,参数间用逗号隔开。

2.2.4 泛型接口的示例代码

  
public interface GenericsInterface<T> {
 
    public  abstract  void genericsInterface1(T element);
 
    public abstract <T> void genericsInterface2();
}  

2.2.5 泛型接口的使用注意事项

实现泛型的类,必须传入泛型实参,然后在实现类中用该实参来替换 T 。

2.3 泛型方法

2.3.1 泛型方法的定义

泛型方法, 是在 调用方法时 指明泛型的具体类型,既可用在类和接口上,还可用在方法上。

2.3.2 泛型方法的格式

  • 格式:修饰符 <类型> 返回值类型方法名(类型变量名){}
  • 示例:public <T> void show(T t){}

2.3.3 泛型方法的使用

  • 所有泛型方法声明,都有一个类型参数声明部分,由尖括号分隔。该类型参数的声明部分,在方法返回值类型之前;
  • 每一个类型参数声明部分,都包括一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符;
  • 类型参数可被用来声明返回值类型,作为泛型方法得到的实际参数类型的占位符。

泛型方法的示例代码

打印各种类型的数组中的元素

 * @param inputArray 
* @param <T> 
*/ 
public  static  <T> void printLog(T[] inputArray) { 
    for (T element : inputArray) {
         LogUtil.e("打印数组中的元素", element + ""); 
    } 
}  

创建各种类型的数组(Integer、Double、Character)

     Integer[] integerArray = {1, 2, 3, 4, 5};
    Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5};
    Character[] characterArray = {'a', 'b', 'c', 'd', 'e'};
 
    printLog(integerArray);
    printLog(doubleArray);
    printLog(characterArray);  

一个 static 的方法,是不能访问泛型类型的参数的。如果 static 方法要使用泛型的能力,就必须使其成为泛型方法。

使用泛型方法,则不受类的限制,不受 static 的限制,可以让方法独立于类而产生变化。

编程原则

泛型方法是为了调高代码的重用性和程序安全性,尽量设计泛型方法去解决问题,如果设计泛型方法,可以取代泛型整个类,就选择泛型方法。另外,泛型方法可以搞定的,就不建议使用泛型类了。

3 泛型类的继承

泛型类被继承的情况有两种:子类明确泛型类的类型参数变量、子类不明确泛型类的类型参数变量。

3.1 子类明确泛型类的类型参数变量

把泛型定义在接口上:

 public interface Inter<T> {
    public abstract void show(T t);
}  

定义一个子类来实现接口:

 public class InterImpl implements Inter<String> {//子类明确泛型类的类型参数变量为String:
    @Override
    public void show(String s) {
        System.out.println(s);
 
    }
}  

测试代码:

 public class mingquefanxingcanshu {
    public static void main(String[] args) {
        Inter<String> i = new InterImpl();
        i.show("hello  Java !");
    }
}  

3.2 子类不明确泛型类的类型参数变量

把泛型定义在接口上:

 public interface Inter<T> {
    public abstract void show(T t);
}  

定义一个子类来实现接口:

 public class InterImpl<T> implements Inter<T> {//实现类不明确泛型类的类型参数变量,实现类也要定义出<T>类型的
    @Override
    public void show(T s) {//子类方法也要继承类的数据类型T
        System.out.println(s);
 
    }
}  

测试代码:

 public class mingquefanxingcanshu {
    public static void main(String[] args) {
        Inter<String> i = new InterImpl();
        i.show("hello java!");
    }
}  

3.3 泛型类的继承注意事项

  • 实现类要的是重写父类的方法,返回值的类型需要同父类一样;
  • 类上声明的泛形,只对非静态成员有效。

总结

本文主要介绍泛型的3种使用方式,结合“ ” 一起看。

从中,我们了解到了:为什么要使用泛型、什么时候使用泛型,以及泛型的三种使用方式,可以作为泛型的实际应用参考。

知识内化需要实战,建议大家多动手练习,毕竟实践才能出真知。

泛型学习资料:

1 《泛型知识全景导图》高清版本

几乎 囊括了所有泛型核心知识点 ,快速构建泛型知识体系。

泛型的3种使用方式:泛型类、泛型接口、泛型方法

泛型知识全景导图

2 《大厂泛型面试真题26道》最新最全整理

精选大厂高频 泛型面试题 ,备面、复习时都可以查看

泛型的3种使用方式:泛型类、泛型接口、泛型方法

大厂泛型面试题26道

泛型的3种使用方式:泛型类、泛型接口、泛型方法

如果觉得有帮助,请顺手 点赞 支持下,谢谢。

我是大全哥,持续更新成体系的Java核心技术。 知识成体系 学习才高效 ,我们下期见~

end

文章来源:智云一二三科技

文章标题:泛型的3种使用方式:泛型类、泛型接口、泛型方法

文章地址:https://www.zhihuclub.com/188568.shtml

关于作者: 智云科技

热门文章

网站地图