泛型:
- 泛型中不能写入基本数据类型
- 泛型不具备继承性:泛型里面写什么类型就只能传什么类型,不能因为其中的类型有继承关系就混着用,但是数据具有继承性
- 泛型可以用通配符,可以在参数中传入一个父子系列,具体看下面
- 泛型中可以放在类,方法(一般是只有当前方法需要泛型时,就放在上面),接口上;在类上
<E>
表示类中的所有方法和参数等其他的所有东西都可以是<E>
;在方法上时,则参数可以是E
- 泛型中传参可以是其子类,如果不写
<>
,那就默认<>
中是Object
类型- 规范、统一集合中的类型:否则存入各种不同的类型时,如果在利用迭代器遍>历的过程中强转成其中一种类型,那么将无法打印:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
Collection <Object> coll=new ArrayList<>();
coll.add(123);
coll.add("小西巴");
coll.add("小赤佬");
Iterator iterator =coll.iterator();
if (iterator.hasNext()){
String i=(String) iterator.next();
System.out.println(i);
}
}
}
如果
<>
中加入了类型,那么将在编译时期就会对一些传入错误的类型的参数进行报错,如add()
方法
<e>
表示不确定当前的类型,真正调用时,就会变成调用的方法:
先创建一个ArraryList<e>
类,再在测试类中写下面
ArraryList<String> aa=new Arrary<>();
第一个大框,第四条(类和方法上)##:
不确定的就写
E``F``V
等,看测试类写啥,e
等就变成啥
普通的用法:加类,方法上
package com.pojo;
public class Dao <E>{
Object[] object=new Object[5];
int size;
public boolean setObject(E e){
object[size] =e;
size++;
return true;
}
public E getObject(int index){
return (E)object[index];
}
}
// 测试类写 String !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
public class Test {
public static void main(String[] args) {
Dao<String> dao=new Dao();
Boolean b1=dao.setObject("潇湘");
Boolean b2=dao.setObject("类阿迪");
String daoObject=dao.getObject(1);
System.out.println(daoObject);
}
}
加方法上的特殊用法:想添加多个参数时:ArrayList<E> list
的E表示参数是E型
public<E> void show(ArrayList<E> list,E e1,E e2,E e3){
list.add(e1);
list.add(e2);
list.add(e3);
}
第一个大框,第四条(接口上):
方法一:实现类实现了泛型的接口之后,就会在一些set方法中的参数确定下来,测试类创建对象时也不用再写<>
,直接就默认是接口泛型的参数:
public class ServiceDao<E>{
}
public class it<String> implements ServiceDao{
}
方法二:把泛型在它的下一任那里继续写着,测试类创建对象的时候再确定,创建对象时写<>
如:it<String> dao
等等,只要能意思保持和接口一致就行
public class it implements ServiceDao<String>{
}
第一个大框,第二条():
泛型不具备继承性看注释:
报错是因为,即使Ye和Fu是继承关系,但是作为泛型参数时,并不会因其继承性而使得泛型内的参数也具有继承性
class Ye{}
class Fu extends Ye{}
public class Test {
public static void main(String[] args) {
ArrayList<Ye> list1=new ArrayList<Ye>;
ArrayList<Fu> list2=new ArrayList<Fu>;
//没问题
method.(list1);
//报错 !!!!!!!
method.(list2);
}
void method(ArrayList<Ye> list){
}
}
泛型数据具备继承性:
class Ye{}
class Fu extends Ye{}
public class Test {
public static void main(String[] args) {
ArrayList<Ye> list=new ArrayList<Ye>;
list.add(new Fu());
list.add(new Ye());
}
void method(ArrayList<Ye> list){
}
}
通配符?
<? extends Ye>:所有Ye的子类类型包括Ye都可以传进来
<?super Fu>:所有Fu的父类类型包括Fu都可以传进来
public void show(ArrayList<? extends Ye> list){}