张孝祥高薪技术4(泛型)

----------- 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学习型技术博客、期待与您交流! ------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值