泛型的应用

本文深入探讨了Java泛型的应用,包括数组、集合类的类型安全、反射技术在对象属性操作中的运用,以及如何通过反射向泛型类添加不同类型的参数。同时,介绍了如何利用泛型实现类型安全的集合操作,以及反射机制在处理对象属性时的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  /**
  *  泛型的应用:提供给javac编译器使用的,数组前面不能使用参数类型,其他可以;
  *
  */
 public static void main(String[] args) throws Exception {
  ArrayList lists=new ArrayList(); //集合中可以存放任意类型为原始类型;
  lists.add(1);   //没用泛型有警告
  lists.add(1l);
  lists.add("abc");
  //int i=(Integer)lists.get(1); //因为不知道类型所以转换错误
  
  ArrayList<String> lists2=new ArrayList<String>();//集合中指定类型
  lists2.add("1");  //是泛型警告去除
  lists2.add("1l");
  lists2.add("abc");
  String is=lists2.get(1); //具体类型不需要转换
  
  ArrayList<Integer> lists3=new ArrayList<Integer>();  //类型参数的实例
  System.out.println(lists3.getClass()==lists2.getClass());//是同一份字节码,java jvm不知道是什么类型;
   
  /*
   *  反射:向Integer类型中添加String类型参数  
   */
     //lists3.add("asd");//不知道是什么对象
  lists3.getClass().getMethod("add", Object.class).invoke(lists3, "abc");//invoke(lists3, "abc");向lists3中添加“abc”;
  System.out.println(lists3.get(0));
  
  Collection<String> collection=new Vector(); //参数化与原始类型兼容;
  //Vector<String> ve=new Vector<Object>();  //参数化类型不考虑继承;
  //下面是否正确:?
  Vector v1=new Vector<String>();
  Vector<Object> v2=v1;
  //以上2个都是对的。
  
  printCollection(lists3); //调用printCollection()
  //String.class.asSubclass(Number.class);
  
  Class<?> x;
  Class<String> y = null;
  x=y; 
  //如何打印HashMap中的键值;通过Map.Entry类添加到set集合
  HashMap<String, Integer> map=new HashMap<String, Integer>();
  map.put("a", 1);
  map.put("b", 2);
  map.put("c", 3);
  Set<Map.Entry<String, Integer>> Entryset=map.entrySet();//Map.Entry类通过set集合可以进行迭代;
   for(Map.Entry<String, Integer> entry:Entryset){
    System.out.println(entry.getKey()+":"+entry.getValue());
   }
  
   add(1, 2); //调用add();
   add(2.2, 3); //都是Number类型
   add(2, "yy"); //都是Object类型
   
   awp(new String[]{"asd","ds","a"}, 1, 2);//调用awp();
   Object s="hkl";
   String str=Change(s);//调用Change();
   
   copy(new Vector<String>(), new String[10]);//调用copy()
 }
   /*
    * 泛型的通配符
    */
 public static void printCollection(Collection<?> lists3){ //可以传入任意类型
  //lists3.add(1); //不知道类型无法添加具体类型参数
  System.out.println(lists3.size());
  for(Object s:lists3){
   System.out.println(s);
  }
 }
 /*
  * 自定义泛型方法
  */
 private static <T> T add(T x,T y){ //T为新的任意类型
  return null;
  
 }
 private static <T> void awp(T[]a,int b,int c){ //替换任意类型的数组元素
  T x=a[b];
  a[b]=a[c];
  a[c]=x;
 }
 /*
  * Object转换为任意类型方法
  */
 private static <T> T Change(Object obj){
  return (T)obj; //强转为自定类型
  }
 /*
  * 将数组拷贝到另一个集合
  */
 public static <T> void copy(Collection<T> s,T[] n){
  
   for (int i = 0; i < n.length; i++) {
     s.add(n[i]); //将数组元素添加到集合
   }
 }

Scala中的(Generics)是一种强大的工具,允许开发者编写可重用的代码,同时保持类安全。在Scala中有多种应用场景,以下是一些常见的应用场景: 1. **集合类**: Scala的集合类(如List、Set、Map等)广使用了。例如,List[Int]表示一个包含整数的列表,List[String]表示一个包含字符串的列表。通过,集合类可以存储任意类的元素,而不会丢失类信息。 ```scala val intList: List[Int] = List(1, 2, 3) val stringList: List[String] = List("a", "b", "c") ``` 2. **函数参数**: 可以用于定义接受任意类参数的函数。例如,定义一个通用的排序函数,可以对任何类的列表进行排序。 ```scala def sortList[T](list: List[T])(implicit ord: Ordering[T]): List[T] = { list.sorted } val sortedIntList = sortList(intList) val sortedStringList = sortList(stringList) ``` 3. **类定义**: 在定义类时,可以使用来创建通用的数据结构。例如,定义一个通用的键值对类,可以存储任意类的键和值。 ```scala class Pair[K, V](val key: K, val value: V) { def getKey: K = key def getValue: V = value } val pair = new Pair(1, "one") println(pair.getKey) // 输出: 1 println(pair.getValue) // 输出: one ``` 4. **类约束**: 还可以用于在编译时对类进行约束。例如,定义一个函数,要求传入的参数必须是某个类的子类。 ```scala def printLength[T <: { def length: Int }](obj: T): Unit = { println(obj.length) } printLength("hello") // 输出: 5 printLength(List(1, 2, 3)) // 输出: 3 ``` 5. **隐式参数**: 可以与隐式参数结合使用,提供更灵活的代码。例如,定义一个通用的函数,依赖于隐式参数来实现特定的功能。 ```scala def printValue[T](value: T)(implicit ev: T => String): Unit = { println(value) } implicit def intToString(i: Int): String = i.toString printValue(123) // 输出: 123 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值