Java知识(泛型)

来源:互联网 发布:手机怎么查看淘宝积分 编辑:程序博客网 时间:2024/06/07 19:07
泛型
泛型:应该存储相同的数据类型,泛型的本质是参数化类型,也就是说操作的数据类型被指定为一个参数,用在类、接口、方法创建中。没有泛型的情况下,通过对类型Object的引用来实现参数的"任意化","任意化"的缺点是要做显式的强制类型转换
使用泛型的意义:
1.约束了数据存储的类型
2.使用get的方法得到的数据类型是确定的
泛型语法:<Object>必须是引用数据类型,如果存储基本数据类型,就要转换成相应的包装类

泛型的特点:
1.泛型的类型只能是类类型(包括自定义类型),不能是简单类型(基本数据类型)。
2.同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容。
3.泛型的类型参数可以有多个
4.泛型的参数类型可以使用extends和super,例如<T extends Number>,其中T必须是Number类或者Number的子类;<T super Number>,其中T必须是Number或者Number的父类,这两种习惯上称为"有界类型",。
5.泛型的参数类型还可以是通配符类型,例如:Class<?>classType=Class.forName("java.lang.String")
?是通配符,可以代指任意类型,一般用在方法的参数里

定义集合时使用泛型:
public class Ch04 {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
int a=list.get(0);
}
}
在定义类时使用泛型:
public class Human<T,E,K,V> {
private T t;
private E e;
private K k;
private V v;
public Human(T t, E e, K k, V v) {
super();
this.t = t;
this.e = e;
this.k = k;
this.v = v;
}
public void test(){
System.out.println(t.getClass().getName());
System.out.println(e.getClass().getName());
System.out.println(k.getClass().getName());
System.out.println(v.getClass().getName());
}
public static void main(String[] args) {
Human<String,Integer,String,Integer> human=new Human<String,Integer,String,Integer>("a",1,"b",2);
human.test();
}
}
输出结果:java.lang.String
java.lang.Integer
java.lang.String
java.lang.Integer
利用extends定义泛型
public class A<T extends Number> {
public static void main(String[] args) throws ClassNotFoundException {
A<Number> a=new A<>();
List<Number> list=new ArrayList<>();
}
//super传入的类型必须是Number或Number的父类
//extends传入的类型必须是Number或Number的子类
//?通配符,可以代指任意类型,方法的参数里
}