泛型,即是参数化类型。在没有泛型前,构建Object类型的集合可能出现ClassCastException。而在jdk5引入泛型后,便可以在编译器实现类型检查(实际为编译器语法糖,虚拟机没有泛型对象,所有对象都属于普通类)
泛型标识符一般为 T,E,K,V
代码示例:
public class Generic {
private T num;
public T getNum() {
return num;
}
public void setNum(T num) {
this.num = num;
}
}
public class GenericTest {
public static void main(String[] args) {
// 按给定泛型决定
Generic gen1 = new Generic();
gen1.setNum("hahaha");
Generic gen2 = new Generic();
gen2.setNum(5);
}
}
注意:
类型参数不能是基本数据类型 没指定具体数据类型,默认为Object 泛型类型逻辑上是不同类型,实际是相同类型(getClass形同)从泛型类派生子类:
子类是泛型类,子类和父类泛型类型要一致 子类不是泛型类,父类需要明确泛型类型public class A extends B{}
public class A extends B{}
(2)泛型方法
代码示例:
public class Generic{
private int num;
public void show(T t){
System.out.println(t);
}
}
public class GenericTest {
public static void main(String[] args) {
Generic gen = new Generic();
// 由参数类型决定
gen.show("hahaha");
gen.show(555);
}
}
注意:
在泛型类中public T getNum()
是成员方法而不是泛型方法,只有public void show(T t)
带的才是泛型方法
成员方法无法定义为static,泛型方法可以
在调用方法的时候定义类型,与泛型类中的类型无关
2.1 泛型可变参数
// 此时t为数组
public void show(T ...t){
for (T t1 : t) {
System.out.println(t1);
};
}
t为数组,可以传任意多的值
gen.show(1,2,3,4,5);
(3)泛型接口
代码示例:
public interface Genericinf{
public abstract void show(T t);
}
/**
*实现类
*/
public class Genericimpl implements Genericinf{
@Override
public void show(T t) {
System.out.println(t);
}
}
public class GenericTest {
public static void main(String[] args) {
new Genericimpl().show("hahaha");
new Genericimpl().show(555);
}
}
(4)类型限定
(在定义泛型类,泛型接口,泛型方法时)
T t ,意味着 t 可以是任何一个类的对象,访问一些特殊方法时就必须限定T的范围(例如上个例子需要访问show方法,若不限制T则有可能有的类没有show方法)
举个例子:
A 父类
B 接口
C 接口
限定类型格式
说明:表示T继承自A且实现了B,C接口
class void Generic{
}
注意:
使用&分隔,可以有任意多个接口,但只能有一个类且必须放在第一个 三、泛型使用 (1)类型通配符(在使用泛型类,泛型接口时)
?为类型实参,而非类型形参
Generic generic = new Generic();
1.1 上限
// 报错了
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
ArrayList list3 = new ArrayList();
1.2 下限
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
// 报错了
ArrayList list3 = new ArrayList();
四、泛型擦除
泛型类
原创文章 16获赞 5访问量 742
关注
私信
展开阅读全文
作者:假裝