泛型

泛型

泛型类型

  • 泛型是JDK 5后推出的新特性,约束数据的类型泛型的使用可以最大限度的复用代码、保护类型安全以及提供性能

  • 解决集合中存入特定类型的元素,取出后全是Object类型,使用就需要类型转换,强转存在风险;

  • 规避一些强转异常,从而将运行时异常提前到编译异常;


泛型集合

  • 泛型的本质是提供类型的“类型参数”,也就是参数化类型,可以为类、接口、方法指定一个类型参数;

  • Java中泛型使用最为广泛的就是集合;泛型的标志:<>;

  • 定义集合时利用<>指定集合中元素的类型,保证存储和读取都是此类型;Java 7之后编译器会自动推断=号右边的<>的类型,所以=号右边的<>不去指定类型;

泛型类

  • 除了可以定义泛型集合外,还可以直接限定泛型类的类型参数:

  • 格式:public class class_name<data_type1,data_type2,...>{}

    data_type1表示类型参数。Java支持声明一个以上的类型参数,只需要逗号隔开;

  • 泛型类一般用于类中的属性类型不确定情况下,在声明属性时,使用语句:

private data_type1 property_name1;//data_type1与类中的data_type1表示同一种数据类型 private data_type1 property_name1;

class Stu<N,A,S>{
   private N name;
   private A age;
   private S sex;

       public N getName() {return name;}
       public void setName(N name) {this.name = name;}
       public A getAge() {return age;}
       public void setAge(A age) {this.age = age;}
       public S getSex() {return sex;}
       public void setSex(S sex) {this.sex = sex;}
       public Stu(N name, A age, S sex) {
           this.name = name;
           this.age = age;
           this.sex = sex;
      } }
  • 实例化泛型类,需要指明泛型类的类型参数,并赋予泛型类型属性相应的值;

  • 也可以不指明,系统会根据属性对应的赋值判断类型;

泛型方法

  • 目前为止,泛型的应用都在类上。同样泛型也可以参数化方法;方法是不是泛型方法取决于自身,和所在类没有关系;

  • 泛型方法是该方法能够独立于类而产生变化。如果使用泛型方法可以取代泛型类,那就应该只使用泛型方法;

  • static方法而言,无法访问泛型类的类型参数;因此static方法有泛型需求,就必须泛型化;

格式:[访问权限修饰符] [static(可选)] [final(可选)] <类型参数列表> 返回值类型 方法名 ([形参列表]){}

泛型接口

  • 类似于泛型类

格式:interface 接口名<> {}

  • 接口中依然只能有抽象方法;

  • 实现泛型接口的具体类:

    1. 是泛型类

    2.实现时指定接口的泛型类型

    3.未涉及到泛型的使用

public interface IBox <T>{//泛型接口
   void setT(T t);
}
public class Box<T> implements IBox<T>{//第一种
   @Override
   public void setT(T t) {}}
public class Box implements IBox<String>{//第二种
   @Override
   public void setT(String o) {}}
public class Box implements IBox{//第三种
   @Override
   public void setT(Object o) {}}

泛型的高级用法

泛型的用法非常灵活,除集合、类、方法,还有一些高级用法。

限制泛型可用类型

  • Java中默认可以使用任何类型来实例化一个泛型对象。所以也可以对泛型类实例化的类型进行限制:

格式:class 类名称 <T excends anyClass>

  • anyClass指某个接口或类。使用泛型限制后,泛型类的类型必须实现或继承anyClass这个接口或类;

泛型通配符

  • 使用泛型时,如果不确定使用什么类型,可以使用泛型通配符

  • <?>表示任何类型,等同于Object;

  • <? extends People>指定类型必须是People或者People的子类;规定了类型的上限

  • <? super People>指定类型必须是People或者People的父类;规定了类型的下限

注意:集合使用泛型通配符时,只能对集合元素检索、删除,无法进行添加、修改

posted @ 2022-08-16 09:26  大嘟肚  阅读(46)  评论(0)    收藏  举报