泛型
泛型类型
-
泛型是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>{//第一种
泛型的高级用法
泛型的用法非常灵活,除集合、类、方法,还有一些高级用法。
限制泛型可用类型
-
Java中默认可以使用任何类型来实例化一个泛型对象。所以也可以对泛型类实例化的类型进行限制:
格式:class 类名称 <T excends anyClass>
-
anyClass指某个接口或类。使用泛型限制后,泛型类的类型必须实现或继承anyClass这个接口或类;
泛型通配符
-
使用泛型时,如果不确定使用什么类型,可以使用泛型通配符
-
<?>表示任何类型,等同于Object;
-
<? extends People>指定类型必须是People或者People的子类;规定了类型的上限
-
<? super People>指定类型必须是People或者People的父类;规定了类型的下限
注意:集合使用泛型通配符时,只能对集合元素检索、删除,无法进行添加、修改
浙公网安备 33010602011771号