Java学习 泛型

一、简介

1. 以集合为例,不指定泛型的容器,可以存放任何类型的元素,指定了泛型的容器,只能存放指定类型的元素以及其子类。

2. 泛型的用法是在容器后面添加<Type>,一般简写为<T>,Type可以是类,抽象类,接口。ArrayList<Hero> heroes = new ArrayList<Hero>();,JDK7以后,后面的泛型可以用<>来代替,写为ArrayList<Hero> heroes = new ArrayList<>();

二、通配符

1. ? extends

ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型。heroList 的泛型可能是Hero,heroList 的泛型可能是APHero,heroList 的泛型可能是ADHero。

所以 可以确凿的是,从heroList取出来的对象,一定是可以转型成Hero的。但是,不能往里面放东西,因为,放APHero就不满足<ADHero>,放ADHero又不满足<APHero>。

2. ? super

ArrayList heroList<? super Hero> 表示这是一个Hero泛型或者其父类泛型。heroList的泛型可能是Hero,heroList的泛型可能是Object。

可以往里面插入Hero以及Hero的子类,但是取出来有风险,因为不确定取出来是Hero还是Object。

3.  ? 

泛型通配符? 代表任意泛型,换句话说,这个容器什么泛型都有可能。所以只能以Object的形式取出来,以其它任意形式取出都会报编译错误,并且不能往里面放对象,因为不知道到底是一个什么泛型的容器。

总结:如果希望只取出,不插入,就使用? extends。如果希望只插入,不取出,就使用? super。如果希望,又能插入,又能取出,就不要用泛型。

三、泛型转型

子类泛型不可以转换为父类泛型,父类泛型也不可以转换为子类泛型。

猜你喜欢

转载自blog.csdn.net/babo18/article/details/114265501