泛型的使用:
(2016/01/08)
泛型是JDK1.5之后新增的新特性,主要目的是为了安全性考虑,这里要注意当使用的是Collection接口下的集合的时候,迭代器(Iterator)是相对于集合的,所以当集合使用泛型的时候这里的迭代器还是要使用泛型的,泛型是使用<>来表示的,里面是引用的数据类型,这里包括类和接口等,当使用了泛型之后就不需要是用强制类型转化了
简单实例代码:
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("world");
//list.add(4);//因为集合中只能添加对象的,这里的实际是一个自动的装箱操作,相当于list.add(new Integer(4));又因为这里的集合使用了泛型,这能放字符串,所以这行代 //码会编译出错
Iterator<String> it = list.itetator();//因为这里使用了泛型,使用迭代器的时候也要使用相应的泛型。
while(it.hasNext()){
String str = it.next();//这里使用了泛型,所以不必要去强制类型转化,如果没有泛型的话,String str = (String)it,next();
Sysout.out.println(str);
}
泛型联想知识点:
泛型实质上就相当于定义一个数组,在实际的开发中定义一个数组形如 Int [] arr = new int[4];这就相当于这个数组里只能存放int 类型的数据,存入其他的数据的时候就会报错这点注意融汇贯通。
(2016/01/09)
泛型的檫处:指的就是泛型只有在编译的时候才存在,运行的时候是不存在泛型的,这种机制就叫泛型的檫除,所以上面的代码中当在运行的时候,其实这里的it.next()是一个object对象,但是这并没有强转就可以使用,是因为这里有一个泛型的补偿机制,实现就是类对象实现的。
在有了泛型之后,之前的比较器Comparable接口这里也必须使用泛型(eg:implements Comparable<Person>这个接口是要加入的Person类要实现的接口),另外一种比较器Compartor<Person>接口,这个是给具体的一个集合中构造函数添加的参数,这一也要使用泛型,这里使用了泛型在相应的compare(Person p1,Person p2)中就是直接的比较这两个对象了。
(2016/01/10)
泛型的不但可以简单的上面的用法,还可以在类中,方法中,接口中定义泛型:
在一个类中定义泛型,这种用法就是在创建对象的时候是不知道使用的哪种引用数据类型的,所以可以通过泛型来解决这个问题,实例代码如下
1.泛型类:在JDK1,5之后使用泛型来接收类中要操作的引用的数据类型(这里是通过方法调用来传递的具体的哪一个数据类型的,(什么时候应用)当类中使用的数据类型不确定的时候就要使用泛型类。这里自定义的泛型类,就和Java自身定义的泛型类使用是一样的如这里的ArrayList类等)
eg: class Util<Demo>{ //当在一个类中定义了这个Demo变量,然后就在类的成员变量中使用这个成员
private Demo demo;
public void method(Demo demo){//这里是在方法里使用了泛型,注意这里和静态的方法是不一样的
Sysout.out.println("method:"+demo)//这里的作用就是把这个对象打印出来的效果
}
public static void mehod1(Demo demo)//注意这里就会报错,因为这里是一个静态的方法,静态方法还没有对象,不知道这里的Demo是什么,如果要使用这个方法就要//使用在方法处申明泛型
public static <TT> void mehod1(TT demo){
Sysout.out.println(demo);
}
public <T> void method2(T demo){//当在方法的申明的时候注明泛型的话,这样可以往这个方法中放入任何的对象
Sysout.out.println(demo);在访问控制符合返回值之间注明的,这里位置是不能乱的
}
public static void main(String []args){
Util<String> util = new Util<String>//这就表示的是在当前将String类型传递个了Demo类,当然这里也可以使用自定义的类
util.method("HelloWorld");//这里讲输出HelloWorld,但是如果这里使用的是非字符串类型的就会报错,这里的util对象只能放字符串类型的变量
util.method2(new Integer(4));//这里就不会报错,因为这里的method2方法已经的申明了泛型,这里的所有的对象类型都是可以使用的
}
}
除了在类和方法中使用泛型,在接口中也可以使用泛型的,在定义接口的时候指定泛型,然后一般的使用在实现接口的类中就要指定具体的类型,当然这不是一定要实现的
Interface inte<TT>{
public void show(TT t);
}
class TestDemo implements Inte<String>{
public void show(String str){
Sysout.println(str);//当使用main方法调用的是偶就会打印出相依的字符串;
}
}
class TestDemo1<Q> implements inte<Q>{//这里表示的就是在实现的时候还是不知道具体的数据类型,这种只有在使用(调用的时候)才指定的
public void show(Q q){
Sysout.out.println(q);
}
}
class Test{
public static void main(String args){
TestDemo demo = new TestDemo();
TestDemo1<Iteger> demo1 = new TestDemo1<Iteger>();
demo.show("haha");
demo1.show(new Integer(1));
}
}
(2016/01/11)说点废话,工作真心的不好做,钱真心的难赚,强迫自己还是要学习,不断的进步,每天一小点
泛型的通配符和泛型的限定:
所谓的泛型的通配符就是?表示的就是各种的与其匹配的类型,泛型限定就是制定特有的类型<? extends Person>表示的就是这里只能接受Person类或者Person类的子类来实现,泛型通配符的使用情况是当在一个类中定义了多个集合的时候,并且都要去遍历各个集合中的元素,可以分别的给各个集合一个迭代器,当然这样的代码不好,代码重复的太多,常见的写法就是写一个通用的方法,来遍历传递过来的集合,这时就可以使用泛型的通配符了。具体的实例详见如下:
public class Fan{
public static void main(String[]args){
ArrayList<String> list = new ArrayList<String>();
ArrayList<Integer> list1 = new ArrayList<Integer>();
list.add("haha");
list.add("HelloWorld");
list1.add(5);
list.add(6);
printArray(list);
printArray(list1);
printArray1(list1)//折两种实现的方式的结果是一样的,不过使用方法中使用泛型的这种方法可以操作相应的类型(可以使用类型转化),而通配符只能这么的使用
}
public static void printArray(Collection<?> list){//这里使用了泛型的通配符表示的就是传递过来的各种数据类型的集合都可以通过它来遍历,这里所指的只是Collection Iterator<?> it = list.iterator(); 接口下的集合
while(it.hasNext()){
Sysout.out.println(it.next());
}
}
public static <T> void printArray1(Collection<T> list){
Iterator<T> it = list.iterator();
while(it.hasNext()){
Sysout.out.println(it.next)
}
}
//这个方法表明只有是Person类或者Person的子类才能使用这个方法,否则就会编译时报错
public static void printArray2(Collection<? extends Person> list){
Iterator<? extends Person> it = list.iterator();
while(it.hasNext()){
Sysout.out.println(it.next());
}
}
}