了解泛型
JDK1.5新加入,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或者实例化时只要指定好需要的具体的类型即可。如集合中的list
public class ArrayList
public ArrayList(Collection<? extends E> c)
public E remove(int index)
运用泛型
泛型的声明
interface List 和 class TestGen<K,V>
其中T,K,V不代表值,而是表示类型。这里使用任意字母都可以。常用T表示,Type的缩写;
T只能是类,不能用基本数据类型。
泛型的实例化
一定要在类名后面指定类型参数的值(类型);如
List list = new ArrayList<>();
自定义泛型
public class Person<T> {
//用泛型设置成员变量
private T info;
//用泛型设置方法返回值
public T getInfo(){
return info;
}
//用泛型设置参数
public void setInfo(T info){
this.info = info;
}
}
对于泛型类
1.对象实例化时不指定泛型,默认为Object
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。
6.不能在catch中使用泛型。
7.从泛型类派生子类,泛型类型需具体化。
泛型和继承的差异
public class Student extends Person{
}
Student student =new Student();
//【向上转型】类型自动转换,子类对象可以赋值给父类
Person person = student;
List<Student> students = new ArrayList<>();
List<Person> persons = new ArrayList<>();
//ps != stus
//泛型不等于一般的子类和父类
//泛型限定的不同类型的集合,即使其元素之间有继承关系,并不表示集合之间的继承关系。
通配符
1.使用类型的通配符:?
比如:List<?>,Map<?,?>
2.读取List<?>对象的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object。
3.写入List<?>中的元素时,不行,因为不知道元素类型,不能添加对象;唯一的例外是null,它是所有类型的成员。
有限制的通配符
<?> 允许所有泛型的引用调用。
<? extends Number> 只允许泛型为Number及Number子类的引用调用。
<? super Number> 只允许泛型为Number及Number父类的引用调用。
<? extends Comparable> 只允许泛型为实现Comparable接口的实现类的引用调用。
还有什么不懂的请参考集合源码,哪里不会点哪里。
相关文章
暂无评论...