泛型是一个重要的JAVA语言加强,它使语言更加灵活.1.类型安全 泛型的主要目标是提高Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中。2.消除强制类型转换 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。3.潜在的性能收益 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型 信息可用于编译器这一事实,为未来版本的JVM 的优化带来可能.
package a;
class Person
{}
//泛型,类似C++模板,一个字母代表一种类型
//泛型就两种情况1在创建对象的时候把泛型确定下来,2在继承的时候把类型确定下来
interface ICrudPerson<T,Y> //CRUD即增(create)删(delete)改(update)查(Retrieve)
{
T addPerson(Y p);
T modifyPerson(Y p);
T deletePersonById(Y p);
T findPersonById(Y p);
}
class StudentCrudImpl implements ICrudPerson<String,Person>//接口实现类命名规范:名字后面加Impl //在继承中确定泛型的类型
{
public String addPerson(Person p) {
return null;
}
public String modifyPerson(Person p) {
return null;
}
public String deletePersonById(Person p) {
return null;
}
public String findPersonById(Person p) {
return null;
}
}
class StudentCrudImpl2<V> implements ICrudPerson<Person,String>
{
V a;
void method(V...a){}
public Person addPerson(String p) {
return null;
}
public Person modifyPerson(String p) {
return null;
}
public Person deletePersonById(String p) {
return null;
}
public Person findPersonById(String p) {
return null;
}
}
class StudentCrudSub extends StudentCrudImpl2<String>
{
void submethod()
{
System.out.println(this.a);//a为String类型
}
}
class Mygenerics<S,I>//在定义对象时确定泛型的类型
{
S s;
I i;
}
class A<T>
{
void m(A<?>a){}
}
public class Test {
static void f1()//将字符串转化为字符型数组
{
String s="ABCDEFG";
char[] c=s.toCharArray();
for(char i:c)
{
System.out.println(i);
}
}
public static void main(String[] args) {
//测试class Mygenerics
Mygenerics<String,Integer> mg=new Mygenerics<String,Integer>();//前面的<>必须写,后面可以不写
mg.i=1;//Integer类型
mg.s="哈哈";//String类型
//测试lass A<T>中的?通配符
A<Object> a=new A<Object>();
A<String> b=new A<String>();
a.m(b);
}
}
泛型使用时的注意事项
1)泛型不能在类中声明静态常量属性
final修饰的属性必须在声明的同时初始化,所以泛型不能声明常量
static修饰的属性是静态属性,先于对象,泛型类型取决于创建对象时传入的实际类型,所以泛型不能声明静态属性
综上所述:不能使用泛型声明静态或常量属性
2)泛型不能在类中初始化数组,但是可以声明数组
初始化数组时需要给元素进行分配空间,但是泛型类型不确定无法分配空间
3)在类中不能使用泛型声明参数个数相同的重载方法
当一个类中有两个泛型时,创建对象时,两个泛型使用相同类型替换,那么重载方法就是相同的方法(同名,参数列表也相同)
4)使用不同实际类型创建出的泛型类对象的引用不可以相互赋值
受限泛型
1)<? extends T>:表示T类或者T类的子类
2)<? super T>:表示T类或者T类的父类
3)<?>:表示任意类型
泛型应用在集合上
泛型在集合中应用,表示的是集合中元素的类型