泛型学习总结:
1.泛型的概念:一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。因此,在java SE5中引入了一个重要的特性:泛型。泛型实现了参数化类型的概念,使代码可以应用于多种类型。
2.类中的泛型:在类中定义泛型时,只需要在定义类的时候在类名后面加一个<> ,在里面写上需要泛化的参数即可如下:
class genericDemo<T,S,W>{
T a;
S b;
W c;
T func(){}
S func1(T s1,W s2){};
}被泛化的参数在类中可以当成普通的类型使用
3.接口中的泛型:接口中泛型的使用方法和类中的泛型相同;
4.方法中的泛型:
在方法中使用泛型时,需要在返回值前面声明需要泛化的参数即:
<T,P>P fun(T){
T a;
P b;
}在方法中使用泛型和在类中使用没什么区别,只是声明的地方不同而已,方法要在返回值前面声明泛型参数
5.泛型中的边界:
对于泛型中使用的参数,如果没有指明边界的话,java会默认将泛型参数擦除到最原始的状态,即Object,因此,除了Object中的功能外,泛型参数不能调用
其它任意功能,如:class mygeneric<T>{
T a;
a.show();//这个调用失败,因为泛型中所有的类型信息都被擦除了,如果指明边界的话,才能调用成功
}
当指明泛型边界时,如:
class mygeneric<T extends my>{//这里假设my类中有show()函数
T a;
a.show();//这个调用成功,因为指明的泛型上限,java只会把泛型参数擦除到my这个类这里,而不会擦除到Object类
}
同样,我们也可以指明泛型的下界,其语法为:
class mygeneric<T super my>{
}//这样这个类就能接受my类和它的父类,
泛型中的通配符?:
假如我们想要用一个父类集合引用指向子类集合引用的话,就会用到通配符?,比如:list<? extends my> mylist=new list<mysub>();//其中mysub是my的子类,
而我们如果直接这样写的话就会报错:list<my> mylist=new list<mysub>;因为java无法将mysub集合转化为my集合,但却可以将mysub集合转化为<? extends my>
这就是通配符的用处,
通配符还有一种用法,即无界用法:list<?>=new list<mysub>();
通配符还可以用在接口中:
interface mygeneric<T>{
}
class mytest{
void fun(mygeneric<? extends T>){//经过通配符修饰,这个函数就能接受所有T类和T的子类作为参数了
}
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com