泛型 Generic
Jdk5之前,对象保存到集合中就会失去其特性,取出来的通常需要手工进行类型转换,这样就可能引起
一些安全性的问题。泛型是只给编译器用的。编译完后字节码中没有字节码。
Jdk5之前,对象保存到集合中就会失去其特性,取出来的通常需要手工进行类型转换,这样就可能引起
一些安全性的问题。泛型是只给编译器用的。编译完后字节码中没有字节码。
注:如果等号两边都用了泛型,必须类型一致,否则就错误。或者一边使用泛型,另一边不适用泛型是可以的。
Java中普通方法、构造方法、静态方法都可以用泛型,但是使用前一定要对泛型进行声明,语法:<T>,可以是任意字母,但通常必须大写。<T>通常放在方法的返回值声明前。如:public static<T>void do(T t);
也可以在class类上声明,如:public class A<T>{}然后直接用泛型T,但是针对静态方法没用(静态方法需要使用前一种方式,在返回之前声明)。
泛型的使用例子:
package com.dp.javaWeb.Generic;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class generic {
/**
* 泛型的应用
*/
@Test
public void test1() {
// TODO Auto-generated method stub
List li=new ArrayList();
li.add("fuck");
// System.out.println(li.get(0));
// int i=(Integer) li.get(0);
// System.out.println(i);//像这样得到集合的值就不对,类型不匹配
//s三种访问集合的方式
for(Object obj:li){
System.out.println(obj);
}
for(int j=0;j<li.hashCode();j++){
System.out.println(li.get(j));
}
Iterator d=li.iterator();
while(d.hasNext()){
Object obj=d.next();
System.out.println(obj);
}
}
//泛型便利list集合
@Test
public void test2() {
// TODO Auto-generated method stub
List<String> li=new ArrayList<String>();
li.add("fuck");
li.add("ssssss");
li.add("Mr_Li13");
for(String s:li){
System.out.print(s+" ");
}
/**
* 结果为:fuck ssssss Mr_Li13
*/
}
//泛型便利Map方式一
@Test
public void test3() {
// TODO Auto-generated method stub
Map<Integer, String> li=new LinkedHashMap<Integer, String>();
li.put(1, "fuck");
li.put(2, "ssssss");
li.put(3, "Mr_Li13");
Set<Integer> keys=li.keySet();
for(Integer s:keys){
String value=li.get(s);
System.out.println("key:"+s+" value:"+value);
}
/**
* 结果为:
* key:1 value:fuck
* key:2 value:ssssss
* key:3 value:Mr_Li13
*/
}
//泛型便利Map方式二
@Test
public void test4() {
// TODO Auto-generated method stub
Map<String, String> li=new LinkedHashMap<String, String>();
li.put("1", "fuck");
li.put("2", "ssssss");
li.put("3", "Mr_Li13");
Set<Map.Entry<String, String>> keys=li.entrySet();
for(Map.Entry<String, String> s:keys){
String key=s.getKey();
String value=s.getValue();
System.out.println("key:"+key+" value:"+value);
}
/**
* 结果为:
* key:1 value:fuck
* key:2 value:ssssss
* key:3 value:Mr_Li13
*/
}
}
类方法的泛型使用:
package com.dp.javaWeb.Generic;
import org.junit.Test;
public class generic1<T> {//在类上直接声明泛型,下面直接用
/**
* 对方法使用泛型
*/
@SuppressWarnings("unused")
public void test1(T t) {
// TODO Auto-generated method stub
}
public T test2(T t) {
return t;
// TODO Auto-generated method stub
}
public static<T> T test3(T t) {//静态方法就需要在返回值前声明泛型
return t;
// TODO Auto-generated method stub
}
@Test
public void test4() {
// TODO Auto-generated method stub
System.out.println(test3("Mr_li13"));//这种可以直接进行调用
generic1<String> gr=new generic1<String>();
System.out.println(gr.test2("333"));//这种需要类实例对象才能调用
}
}