java中泛型

文章目录

  • 泛型

泛型

JDK1.5之后出现的。泛型的本质是**为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限定的类型)。**提高代码的复用性。

泛型使用过程中,操作的数据类型倍指定为一个参数。这种参数类型可以用在类、接口、方法中,分别被称为泛型类、泛型接口、泛型方法。

泛型的优点:

  1. 泛型的本质时为了参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型,很明显这种方法提高了代码的复用性。
  2. 泛型的引入提高了安全性,泛型提供了编译前类型安全检测机制。该机制允许开发者在编译时检测到非法的类型。
  3. 在没有泛型的情况下,通过对类型 Object 的引用来实现参数的"任意化","任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患泛型的好处可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的。

写泛型标识符时应该养成的习惯,增加可读性:

  • ? 表示不确定的 java 类型
  • T (Type) 表示具体的一个java类型
  • K V (Key Value) 分别代表java键值中的Key Value
  • E (element) 代表Element

泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型。

//声明一个泛型类
public class Person<T>{
    
}

public class Person<K,V>{
    
}
//声明一个泛型方法
public <T> T getVar(T t){
    return null;
}

为什么要使用泛型方法呢?

​ 泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

**泛型类中使用泛型的方法并不一定是泛型方法。**泛型方法有一定格式的。

补充:

  1. 异常类不能声明为泛型类。
  2. 泛型类中如果要定义泛型数组T[] arr=(T[]) new Object[10];

泛型在继承方面的体现:

如果A是B的父类,G和G二者不具备父子关系,二者是并列关系。两者的父类是G

类A是类B的父类,A 是 B 的父类

 public static void main(String[] args) throws IOException, ClassNotFoundException {
     List<String>list=new ArrayList<String>();
     get(list);//会报错
     get1(list);//不会报错
    }
   
     public static void get(List<Object> list){
        int a=1;
     }
    
     public static void get1(List<? extends Object> list){
        int a=1;
     }
List<?> list=null;
List<String> list1=new ArrayList<String>;
list=list1;
//list不能add添加元素,但是可以读取元素。

使用上界通配符和下界通配符的好处:

上界通配符

  • 如果传入类型不是E或者E的子类,编译不成功。
  • 泛型中可以使用E的方法,要不然得强转成E之后才能使用。

下界通配符

  • 类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类

T和?的区别:

T运行时是一个确定的类型,通常用于泛型类和泛型方法的定义。?运行时是一个不确定的类型,通常用于泛型方法的调用代码参数,不能定义泛型方法和泛型类。

?是一个不确定类,?和T都表示不确定的类型 ,但如果是T的话,函数里面可以对T进行操作,比方 T car = getCar(),而不能用? car = getCar()。

区别1:可以通过T来确保泛型参数的一致性。

 public static void main(String[] args){
        List<Integer> integerList = new ArrayList<>();
        List<Integer> floatList = new ArrayList<>();
        test1(integerList,floatList);
        test(integerList,floatList);//报错,因为两个参数的T不一致
 }
     
public static void test1(List<? extends Number> dest, List<? extends Number> src){ }
  public static <T extends Number> void test(List<T> dest, List<T> src){}

区别2:T可以通过&进行多重限定。?就不可以。编译之前多重限定范围取最小范围或者共同子类。

 public static void main(String[] args){
 
 }
 public static <T extends List & Collection> void test2(T t) {

  }

区别3:?通配符可以使用超类限定而T不行。

T extends A
 
 ? extends A
 ?  super A  

你可能感兴趣的:(java,开发语言)