您的位置:首页 > 职场人生

黑马程序员_java06_泛型

2015-09-10 16:40 344 查看
——- android培训java培训、期待与您交流! ———-

泛型也被称为参数化类型,就是在定义类,接口和方法时,规定了创建将要处理的对象类型。泛型更多地体现在集合的应用上,用于表明集合元素的类型限制。

泛型的好处:

1.将运行时期出现的问题ClassCaseException,转移到了编译时期,方便于程序员解决问题。让运行时间减少安全。

2.避免了强制转换的麻烦。

1.定义简单的泛型类

API中有大量的泛型类与泛型接口等。定义泛型只需要在声明类时在类名后使用(E可以是任何其他字母)的形式指定该类是一个泛型类,E称为类型参数,类型参数可以在该类中需要数据类型的都地方使用,如属性声明,方法声明等。在具体使用该类时,E可以使用任何一个具体类型替代。

泛型格式: 通过<>定义要操作的引用数据类型。

在使用java提供的对象时,什么时候写泛型?

通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用于接收类型的。当使用集合时,将集合中要储存的数据类型作为参数传递到<>中即可。

import java.util.*;
class GenericDemo
{
public static void main(String[] args)
{
TreeSet<String> ts=new TreeSet<String>();
ts.add("java01");
ts.add("java02");
ts.add("java03");
ts.add("java04");
Iterator<String> it=ts.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
}


集合TreeSet中定义了泛型,TreeSet全部是String类型,若是非String类型的,无法传入。

泛型参数的限定

一个类通过泛型 参数定义,实现了处理对象的普遍性,这是优点,但是也有缺点。前面的泛型类,泛型接口及泛型方法的定义存在一个缺陷,就是由于参数的类型是未知的,只能在运行时确定下来,因此,就限制了泛型类对目标对象的处理能力。因为泛型类只能将其视为Object类型的实例进行处理,无法更有效地使用参数实力本身所能够提供的方法或者属性。通过使用参数类型的边界限定,可以有效地解决这个问题。

1.定义泛型参数的上界

通过使用extends关键字,可以限定泛型参数的类型上界,声明如下:

public class StudentDemo<T ? extends Person>


上面的方法规定了StudentDemo类所能处理的参数类型和Person有继承关系,这样程序中就会这种关系,将T声明的变量视为Person类型,从而利用了Person类型的特征进行工作。另外,extends 关键字所声明的上界即可以是一个类,也就是一个接口。这一点和接口的实现关键字是不同的。

2.定义泛型参数的下界

通过使用个super关键字可以固定泛型参数的类型为某种类型或者其他超类,例如:

List<? super Person> listP=new ArrayList<T>();


当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符。通过JDK提供数组排列方法sort()。

3.通配符

“?”符号声明参数类型可以是任何一个类型,它和参数T的含义是有区别的。T表示一个未知类型,而“?”表示任何一个类型。这种通配符一般有一下三种用法:

(1)单独的 ? ,用于表示任何类型。

(2)?extends type ,表示带有上界。

(3)?super type ,表示带有下界。

import java.util.*;
class GenericDemo8
{
public static void main(String[] args)
{
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("zhangsan1",3));
al.add(new Person("zhangsan2",3));
al.add(new Person("zhangsan3",3));
printColl(al);
}
public static void printColl(ArrayList <? extends Person> al)
{
Iterator<? extends Person> it=al.iterator();
while (it.hasNext())
{
//System.out.println(it.next().getName());
//System.out.println(it.next().getAge());
Person p=it.next();
System.out.println(p.getName()+"\t"+p.getAge());
}
}
}
class Person
{
private int age;
private String name;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
}
class Student extends Person
{
Student(String name,int age)
{
super(name,age);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 泛型