----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1 泛型的作用
无法加入指定类型外的数据 ArrayList<Integer> collection2 = new ArrayList<Integer>();
collection2.add(1);
/*collection2.add(1L);
collection2.add(“abc”);*///这两行代码编译时就报告了语法错误
int i2 = collection2.get(0);//不需要再进行类型转换
2 泛型是提供给javac编译器使用的,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(3);
list1.add(5);
System.out.println(list1);
ArrayList<String> list2 = new ArrayList<String>();
list2.add("a");
System.out.println(list1.getClass()==list2.getClass());//字节码相同的
//反射取得add()方法
Method method = list2.getClass().getMethod("add", Object.class);
//把12装了进去,原来只能装String的
method.invoke(list2, 12);
System.out.println(list2);
3 ?通配符
问题:打印出任意参数化类型的集合中的所有数据
/*
public static void print(Collection<Object> coll)
Collection<Object> list = new Collection<String>() 这错的 因为:左右两边标签必须一致,也不能是基本数据类型(四型八种)
所以,不能用Object
*/
public static void print(Collection<?> coll)
{
//coll.add(..);
//增强for循环迭代
for( Object ob : coll)
{
System.out.println(ob);
}
}
/*
总结:
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
*/
4
泛型集合类的综合案例
//迭代HashMap
HashMap<Integer, String> map = new HashMap<Integer,String>();
map.put(1, "a");
map.put(2, "ab");
map.put(3, "abc");
//取出key转成HashSet集合
Set<Integer> keyset = map.keySet();
//增强for循环迭代
for( Integer in: keyset)
{
System.out.println( in+" "+map.get(in));
}
5 泛型的的补充
(1)、函数上泛型的自定义
修饰符 泛型自定义<E> 返回值类型 函数名( 参数类型 变量名 ){
return 返回值;
}
(2)、类上的泛型自定义
修饰符 类名<泛型名>{
}
注意:
1、成员函数可以直接使用类上定义的泛型,不能定义和类上同名的泛型。
2、静态成员函数中,不能使用类上定义好的泛型,因为静态不能调用动态的
(3)、抽象类、
class Fu<T>
{
public T getAge(T t)
{
return t;
}
}
class Zi extends Fu//默认的是object类型
{
}
class Zii extends Fu<String>
{
}
class Ziii<E> extends Fu<String>
{
}
注意: extends Fu<T>泛型不能被继承,只能被复写 读取
(4) 接口
一个控制器的接口
interface controller<T>
{
void open();
void close();
}
//实现接口
class Phone implements controller<String>
{
public void open()
{
System.out.println("open");
}
public void close()
{
System.out.println("close");
}
}
6 解决了一个疑问 import java.util.ArrayList;
class Demo5
{
// 自定义一个函数,该函数中遍历任意一个集合的任意类型的元素对象
public static void print( Collection<Integer> coll )
{
Iterator it=coll.iterator();
for (;it.hasNext() ; )
{
System.out.println(it.next());
}
coll.remove(12);
coll.clear();
}
public static void main(String[] args)
{
ArrayList a=new ArrayList();
a.add(123);
a.add(1322);
a.add(1232);
a.add( new Object());
a.add("1232");
print(a);
}
}
/*
运行结果:
Hello World!
123
1322
1232
java.lang.Object@de6ced
1232
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------