先上段代码
List list = new ArrayList();
list.add("shiyanlou");
list.add("admin");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); // 1
System.out.println("name:" + name);
}
在上述代码中,定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。
这时候就需要加个约束。什么是泛型?泛型,即“参数化类型”。
而泛型就帮我们提供了类型参数,让我们提取规定好集合对象的类型。
示例:先新建两个类。
public class Animal {
public Animal(){
System.out.println("我是动物");
}
}
public class Dog extends Animal {
public Dog(){
System.out.println("我是狗");
}
}
新建类,添加如下示例代码
public class Test {
/*
注意:定义带类型参数的方法,其主要目的是为了表达多个参数以及返回值之间的关系。例如本例子中T和S的继承关系, 返回值的类型和第一个类型参数的值相同。
*/
public<T, S extends T> T testDemo(T t, S s){
System.out.println("我是 T 类型,我的类型是" + t.getClass().getName());
System.out.println("我是 S 类型,我的类型是" + s.getClass().getName());
return t;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test = new Test();
Dog d = new Dog();
Animal a0 = new Animal();
Animal a1 = test.testDemo(a0, d);
System.out.println("我是整数 a,我的类型是" + a1.getClass().getName());
}
}
运行结果为:
泛型中的<>内容,也可以用通配符。比如下面示例中的?号。
import java.util.List;
public class Test {
public void testDemo(List<?> s){
for(Object obj:s){
System.out.println("我的类型是" + obj.getClass().getName());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test = new Test();
Dog a0 = new Dog();
Animal a1 = new Animal();
List<Animal> s = new ArrayList<Animal>();
s.add(a0);
s.add(a1);
test.testDemo(s);
}
}
运行结果为
文章整理自:
实验楼泛型
Java总结篇系列:Java泛型
网友评论