Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

野性酷女 2022-09-22 04:00 460阅读 0赞

学习目标

掌握泛型接口的使用

掌握泛型方法的定义的及使用

掌握泛型数组的使用

掌握泛型的嵌套设置

之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型。

定义泛型接口

在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上,如下格式所示:

[访问权限] interface 接口名称<泛型标识>{}

  1. interface Info<T>{ // 在接口上定义泛型
  2. public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
  3. }

如果现在一个子类实现此接口但是没有进行正确的实现,则在编译时会出现警告信息。

  1. interface Info<T>{
  2. public T getVar();
  3. }
  4. class InfoImpl implements Info{
  5. public String getVar(){
  6. return null;
  7. }
  8. }

以上的操作,并不是一个子类实现泛型的最好操作,最好在实现的时候也指定具体的泛型类型。

泛型接口实现的两种方式

定义子类:在子类的定义上在也声明泛型类型。

  1. interface Info<T>{ // 在接口上定义泛型
  2. public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl<T> implements Info<T>{ // 定义泛型接口的子类
  5. private T var ; // 定义属性
  6. public InfoImpl(T var){ // 通过构造方法设置属性内容
  7. this.setVar(var) ;
  8. }
  9. public void setVar(T var){
  10. this.var = var ;
  11. }
  12. public T getVar(){
  13. return this.var ;
  14. }
  15. };
  16. public class GenericsDemo24{
  17. public static void main(String arsg[]){
  18. Info<String> i = null; // 声明接口对象
  19. i = new InfoImpl<String>("刘勋") ; // 通过子类实例化对象
  20. System.out.println("内容:" + i.getVar()) ;
  21. }
  22. };

Center

如果现在实现接口的子类不想使用泛型声明,则在实现接口的时候直接直接指定好具体的操作类型即可。

  1. interface Info<T>{ // 在接口上定义泛型
  2. public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl implements Info<String>{ // 定义泛型接口的子类
  5. private String var ; // 定义属性
  6. public InfoImpl(String var){ // 通过构造方法设置属性内容
  7. this.setVar(var) ;
  8. }
  9. public void setVar(String var){
  10. this.var = var ;
  11. }
  12. public String getVar(){
  13. return this.var ;
  14. }
  15. };
  16. public class GenericsDemo25{
  17. public static void main(String arsg[]){
  18. Info i = null; // 声明接口对象
  19. i = new InfoImpl("李兴华") ; // 通过子类实例化对象
  20. System.out.println("内容:" + i.getVar()) ;
  21. }
  22. };

对于后者,经常使用。

泛型方法

之前的所有泛型除了可以为类中的属性指定类型之外,也可以定义方法,泛型方法所在的类中是否是泛型类本身是没有任何关系的。

定义泛型方法

泛型方法可以定义泛型参数,此时,参数的类型就是传入数据的类型,使用如下格式定义泛型方法。

泛型方法的简单定义:

[访问权限]<泛型标示> 泛型标示 方法名称([泛型标示 参数名称])

程序实例如下:

  1. class Demo{
  2. public <T> T fun(T t){ // 可以接收任意类型的数据
  3. return t ; // 直接把参数返回
  4. }
  5. };
  6. public class GenericsDemo26{
  7. public static void main(String args[]){
  8. Demo d = new Demo() ; // 实例化Demo对象
  9. String str = d.fun("刘勋") ; // 传递字符串
  10. int i = d.fun(24) ; // 传递数字,自动装箱
  11. System.out.println(str) ; // 输出内容
  12. System.out.println(i) ; // 输出内容
  13. }
  14. };

Center 1

通过泛型方法返回泛型类的实例

因为之前的代码中可以发现,只要在方法中定义了泛型操作,则可以传递任意的数据类型。

程序示例如下:

  1. class Info<T extends Number>{ // 指定上限,只能是数字类型
  2. private T var ; // 此类型由外部决定
  3. public T getVar(){
  4. return this.var ;
  5. }
  6. public void setVar(T var){
  7. this.var = var ;
  8. }
  9. public String toString(){ // 覆写Object类中的toString()方法
  10. return this.var.toString() ;
  11. }
  12. };
  13. public class GenericsDemo27{
  14. public static void main(String args[]){
  15. Info<Integer> i = fun(20) ;
  16. System.out.println(i.getVar()) ;
  17. }
  18. public static <T extends Number> Info<T> fun(T param){
  19. Info<T> temp = new Info<T>() ; // 根据传入的数据类型实例化Info
  20. temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中
  21. return temp ; // 返回实例化对象
  22. }
  23. };

使用泛型统一传入参数的类型

如果在一些操作中,希望传递的泛型类型是一致的类型。

实例如下:

  1. class Info<T>{ // 指定上限,只能是数字类型
  2. private T var ; // 此类型由外部决定
  3. public T getVar(){
  4. return this.var ;
  5. }
  6. public void setVar(T var){
  7. this.var = var ;
  8. }
  9. public String toString(){ // 覆写Object类中的toString()方法
  10. return this.var.toString() ;
  11. }
  12. };
  13. public class GenericsDemo28{
  14. public static void main(String args[]){
  15. Info<String> i1 = new Info<String>() ;
  16. Info<String> i2 = new Info<String>() ;
  17. i1.setVar("HELLO") ; // 设置内容
  18. i2.setVar("liuxun") ; // 设置内容
  19. add(i1,i2) ;
  20. }
  21. public static <T> void add(Info<T> i1,Info<T> i2){
  22. System.out.println(i1.getVar() + " " + i2.getVar()) ;
  23. }
  24. };

Center 2
但是如果传递到add订单中的两个泛型类型不统一,则会出现错误。

  1. class Info<T>{ // 指定上限,只能是数字类型
  2. private T var ; // 此类型由外部决定
  3. public T getVar(){
  4. return this.var ;
  5. }
  6. public void setVar(T var){
  7. this.var = var ;
  8. }
  9. public String toString(){ // 覆写Object类中的toString()方法
  10. return this.var.toString() ;
  11. }
  12. };
  13. public class GenericsDemo29{
  14. public static void main(String args[]){
  15. Info<Integer> i1 = new Info<Integer>() ;
  16. Info<String> i2 = new Info<String>() ;
  17. i1.setVar(20) ; // 设置内容
  18. i2.setVar("liuxun") ; // 设置内容
  19. add(i1,i2) ; // X :此处因为类型不一致就会出现错误
  20. }
  21. public static <T> void add(Info<T> i1,Info<T> i2){
  22. System.out.println(i1.getVar() + " " + i2.getVar()) ;
  23. }
  24. };

泛型数组

使用泛型方法的时候,也可以传递或返回一个泛型数组。

程序如下:

  1. public class GenericsDemo30{
  2. public static void main(String args[]){
  3. Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组
  4. fun2(i) ;
  5. }
  6. public static <T> T[] fun1(T...arg){ // 接收可变参数
  7. return arg ; // 返回泛型数组
  8. }
  9. public static <T> void fun2(T param[]){ // 输出
  10. System.out.print("接收泛型数组:") ;
  11. for(T t:param){
  12. System.out.print(t + "、") ;
  13. }
  14. }
  15. };

Center 3
注意:… 表示可变参数 ,可以传递任意多的参数,可以当数组进行处理。

泛型的嵌套设置

之前所说的全部泛型操作,都是直接通过实例化类的时候完成,当然,在设置的时候也会看见嵌套的设置形式。

程序实例如下:

  1. class Info<T,V>{ // 接收两个泛型类型
  2. private T var ;
  3. private V value ;
  4. public Info(T var,V value){
  5. this.setVar(var) ;
  6. this.setValue(value) ;
  7. }
  8. public void setVar(T var){
  9. this.var = var ;
  10. }
  11. public void setValue(V value){
  12. this.value = value ;
  13. }
  14. public T getVar(){
  15. return this.var ;
  16. }
  17. public V getValue(){
  18. return this.value ;
  19. }
  20. };
  21. class Demo<S>{
  22. private S info ;
  23. public Demo(S info){
  24. this.setInfo(info) ;
  25. }
  26. public void setInfo(S info){
  27. this.info = info ;
  28. }
  29. public S getInfo(){
  30. return this.info ;
  31. }
  32. };
  33. public class GenericsDemo31{
  34. public static void main(String args[]){
  35. Demo<Info<String,Integer>> d = null ; // 将Info作为Demo的泛型类型
  36. Info<String,Integer> i = null ; // Info指定两个泛型类型
  37. i = new Info<String,Integer>("刘勋",20) ; // 实例化Info对象
  38. d = new Demo<Info<String,Integer>>(i) ; // 在Demo类中设置Info类的对象
  39. System.out.println("内容一:" + d.getInfo().getVar()) ;
  40. System.out.println("内容二:" + d.getInfo().getValue()) ;
  41. }
  42. };

Center 4

总结:

1、泛型在接口上可以定义,及其实现的方式。

2、泛型在使用的时候可以进行嵌套的操作,只要根据其操作语法即可。

3、泛型方法上使用泛型标记的时候需要先声明,同样可以指定其操作的上限和下限。

发表评论

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

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

相关阅读