泛型
使用泛型类型的通配符
泛型类名称<? extends List> a=null;
"其中<? extends List>表示未知类型,当需要时要单独实例化,另外使用通配符声明的实例化对象不能加入新的信息,只能获取或删除。"
A<? extends List> a=null;
a=new A<ArrayList>;
a=new A<LinkedList>;
"如果使用A<? super List> a=null;"//这样定义对象a,只能接受List接口或上层父类类型
//测试代码
public static void main(String[] args) {
Student<NvZhuang,Dog> xiaoming=new Student<>();
xiaoming.setPet(new Dog());
Dog dog=xiaoming.getPet();
dog.voice();
NanZhuang nan=new NanZhuang();
nan.chuan();
Student<NanZhuang,Cat> xiaohong=new Student<>();
Cat cat=new Cat();
xiaohong.setPet(cat);
cat=xiaohong.getPet();
cat.voice();
}
"******************************************************"
//student类部分代码
//通过继承对其传入对象进行限制
public class Student<T,E extends Pet> {
private String name;
private int age;
private T colth;//用泛类创建变量设置,添加set、get方法
private E pet;
public T getColth() {
return colth;
}
public void setColth(T colth) {
this.colth = colth;
}
"**************************************************"
public class Pet {
}
"**************************************************"
public class Dog extends Pet{
public void voice(){
System.out.println("小狗汪汪叫");
}
}
"**************************************************"
public class Cat extends Pet {
public void voice(){
System.out.println("小猫喵喵叫");
}
}
"**************************************************"
public class ManColth {
public void chuan(){
System.out.println("穿上帅气的西装");
}
}
"**************************************************"
public class WomenColth {
public void show(){
System.out.println("穿好看的衣服");
}
}
"**************************************************"
定义泛型类
"*************************定义泛型类*****************"
public class OverClass<T> {
private T over;//定义泛型成员变量
public T getOver() {
return over;
}
public void setOver(T over) {
this.over = over;
}
}
"****************测试类*************************"
public static void main(String[] args) {
//实例化一个Boolean型的对象
OverClass<Boolean> over1=new OverClass<Boolean>();
//实例化一个Float型的对象
OverClass<Float> over2=new OverClass<>();
over1.setOver(true);
over2.setOver(12.3f);
System.out.println(over1.getOver());
System.out.println(over2.getOver());
}
总结
使用泛型定义的类在声明该类对象时可以根据不同的需求指定(T)真正的类型,而在使用类中的方法传递或返回数据类型时,将不再需要进行类型转换操作,而是使用在声明泛型类对象时“<>”符号中设置的数据类型。
泛型类声明数组类型
"*****************定义泛型数组*****************"
public class ArrayClass<T> {
private T[] array;
public T[] getArray() {
return array;
}
public void setArray(T[] array) {
this.array = array;
}
}
"******************测试类********************"
public static void main(String[] args) {
ArrayClass<String> a=new ArrayClass<>();
String [] array={"成员1","成员2","成员3","成员4"};
a.setArray(array);
for (int i = 0; i <a.getArray().length; i++) {
System.out.println(a.getArray()[i]);
}
常用的被泛型化的集合类
集合类 | 泛型定义 |
---|---|
ArrayList | ArrayList<E> |
HashMap | HashMap<K,V> |
HashSet | HashSet<E> |
vector | Vector<E> |
泛型实例化常用集合类
public static void main(String[] args) {
ArrayList<Integer> a=new ArrayList<>();//定义ArrayList容器,设置容器内的值类型为Integer
a.add(1);//为容器增加新值
a.add(2);
for(int i=0;i<a.size();i++){
int b=a.get(i);
System.out.println(b);//根据容器的长度循环显示容器内的值
}
HashMap<Integer,String> m=new HashMap<>();//定义HashMap容器,设置容器的键名与键值类型
for(int i=0;i<5;i++){
m.put(i,"成员"+i);//为容器填充键名与键值
}
for(int i=0;i<m.size();i++){
System.out.println(m.get(i));//根据键名获取键值
}
Vector<String> v=new Vector<>();//定义Vector容器
for(int i=0;i<5;i++){
v.addElement("程序员"+i);//为Vector容器添加内容
}
for(int i=0;i<v.size();i++){
System.out.println(v.get(i));
}
}
泛型总结
1、泛型的类型参数只能是类类型,不可以是简单类型,如A
<int>
这种泛型定义 就是错误的
2、泛型的类型个数可以是多个
3、可以使用extends关键字限制泛型的类型
4、也可以使用通配符限制泛型的类型