自学内容网 自学内容网

泛型的实现方式

1. 什么是泛型?

Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。

编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型

比如:

ArrayList<Person> persons = new ArrayList<Person>()

这行代码就指明了该 ArrayList 对象只能传入 Person 对象,如果传入其他类型的对象就会报错。

例如: 是Book 类型的对象就会报错

ArrayList<Person> persons = new ArrayList<Book>()

并且,原生 List 返回类型是 Object ,需要手动转换类型才能使用使用泛型后编译器自动转换。

2.泛型有哪几种方式?

泛型一般又有三种使用方式:泛型类泛型接口泛型方法

1.泛型类

类型参数用于类的定义中,则该类被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map等。

 泛型类的基本语法如下:

class 类名称 <泛型标识> {
  private 泛型标识 /*(成员变量类型)*/ 变量名; 
  .....

  }
}

 例如:

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{

    private T key;

    public Generic(T key) {
        this.key = key;
    }

    public T getKey(){
        return key;
    }
}
 

如何实例化泛型类:

Generic<Integer> genericInteger = new Generic<Integer>(666);

2.泛型接口

泛型接口和泛型类的定义差不多,基本语法如下:

public interface 接口名<类型参数> {
    ...
}

 

使用泛型接口需注意:泛型接口中的类型参数,在该接口被继承或者被实现时确定

例如:

public interface Book<T> {
    public T method();
}

实现泛型接口又有两种方式:

1.实现泛型接口,不指定类型:
class Book<T> implements Book<T>{
    @Override
    public T method() {
        return null;
    }
}
 
2.实现泛型接口,指定类型:
class GeneratorImpl implements Generator<String> {
    @Override
    public String method() {
        return "hello";
    }
}
 

3.泛型方法

当在一个方法签名中的返回值前面声明了一个 < T > 时,该方法就被声明为一个泛型方法。< T >表明该方法声明了一个类型参数 T,并且这个类型参数 T 只能在该方法中使用。当然,泛型方法中也可以使用泛型类中定义的泛型参数

并且 只有在方法签名中声明了< T >的方法才是泛型方法,仅使用了泛型类定义的类型参数的方法并不是泛型方法。

   public static < E > void printArray( E[] inputArray )
   {
         for ( E element : inputArray ){
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }

使用:

// 创建不同类型数组:Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray  );
printArray( stringArray  );

2. 注意:

public static < T > void printArray( T[] inputArray ) 一般被称为静态泛型方法 ;在 java 中泛型只是一个占位符,必须在传递类型后才能使用。类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。只能使用自己声明的 <T>

泛型方法签名中声明的类型参数只能在该方法里使用,而泛型接口、泛型类中声明的类型参数则可以在整个接口、类中使用。
当调用泛型方法时,根据外部传入的实际对象的数据类型,编译器就可以判断出类型参数 T所代表的具体数据类型。

 

4.总结:

泛型使编译器 可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常,泛型也提高了程序代码的可读性。


原文地址:https://blog.csdn.net/whs_8792/article/details/142771148

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!