您的位置:首页 > 其它

什么是泛型?

2019-04-10 19:11 99 查看
泛型是通过参数化类型提高代码重用性,并在编译器强制进行类型检查的机制

泛型时Java SE 1.5的新特性
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
这种参数类型可以用在类,接口和方法的创建中,分别称为泛型类,泛型接口,泛型方法
Java语言引入反省的好处是安全简单
在Java SE 1.5之前,没有泛型的情况下,通过对类型Object的引入来实现参数的“任意化”,“任意化”带来的缺点是要做显示的强制类型转换,而这种转换时要求开发者对实际参数类型可以预知的情况下进行的,对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率

public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("123");
list.add("dsa");
list.add(100);//编译时出现的问题
list.add(1.2);//编译时出现的问题
}
1.泛型的类型参数只能时类类型(包括自定义类),不能是简单类型。(简单类型包括基本数据类型)
2.同一种泛型可以对应多个版本(因为参数类型时不确定的),不同版本的泛型类实例是不兼容的。
3.泛型的参数类型可以使用extends,super。习惯上称为“有界类型“。
4.泛型的参数类型可以是通配符类型。
private void display(List <?> list){
System.out.println(list);
}
public static void main(String[] args) {
Integer i = new Integer(100);
Number n = new Integer(200);
Object o = new Integer(300);
List<Integer> list1 = new ArrayList<Integer>();
list1.add(i);
List<Number> list2 = new ArrayList<Number>();
list2.add(n);
List<Object> list3 = new ArrayList<Object>();
list3.add(o);
exam1 e = new exam1();
e.display(list1);
e.display(list2);
e.display(list3);

}

private void display(List <? extends Number> list){
System.out.println(list);
}
public static void main(String[] args) {
Integer i = new Integer(100);
Number n = new Integer(200);
Object o = new Integer(300);
List<Integer> list1 = new ArrayList<Integer>();
list1.add(i);
List<Number> list2 = new ArrayList<Number>();
list2.add(n);
List<Object> list3 = new ArrayList<Object>();
list3.add(o);
exam1 e = new exam1();
e.display(list1);
e.display(list2);
e.display(list3);//编译出现问题

}
private void display(List <? super Number> list){
System.out.println(list);
}
public static void main(String[] args) {
Integer i = new Integer(100);
Number n = new Integer(200);
Object o = new Integer(300);
List<Integer> list1 = new ArrayList<Integer>();
list1.add(i);
List<Number> list2 = new ArrayList<Number>();
list2.add(n);
List<Object> list3 = new ArrayList<Object>();
list3.add(o);
exam1 e = new exam1();
e.display(list1);//编译出现问题
e.display(list2);
e.display(list3);

}
泛型类

public class Test{
//语法 访问修饰符 class 类名 <类型参数>
}

泛型接口

public interface Test{
//语法 访问修饰符 interface 类名<类型参数>
}

泛型方法

public static void show(){
//语法 修饰符之后 <类型参数> 返回值类型 类名(){}u
}

泛型方法与非泛型方法的一同
同:声明时均传入形参,使用时均传入实参
异:非泛型方法在声明时限定实参值的类型,泛型方法在声明时限定实参类型的范围

类型实参只能是引用数据类型,不能是基本数据类型

同一种泛型可以有多个版本,不同版本需要考虑兼容性

public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>();
List<Number> list2 = new ArrayList<Number>();
list1=list2;//不同版本需考虑兼容性

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: