• 【原】泛型-Java


    泛型是Java SE5.0中新增的新特性,通过泛型使得在代码编译的时候就能检查类型安全,并且所有的强制类型转换都是自动和隐式的,从而提高代码的重用率。

    Note:在JavaSE7+以后的版本中,构造函数可以省略泛型类型。省略的类型可以从变量的类型推断得出。如:List<Map<String,String>> listmaps=new ArrayList<>();

    • 泛型类型的继承规则
    • 通配符类型
    • 通配符的超类型限定
    • 无限定通配符
    • 泛型反射

    1.泛型类型的继承规则

    无论ST有什么联系,通常,Pair<S> Pair<T>没有什么联系

    如下所示:public class Manager extends Employee

    可见,泛型中<>前面的类的继承关系才会起作用,而<>内部的类的继承关系就不起作用

     

    2.通配符类型

    Pair<? extends Employee>

    利用通配符可以解决上述中出现的<>内不能继承的问题

    3.通配符的超类型限定

    ? super Manager,这个通配符限制为Manager的所有超类型

    4.无限定通配符

    Pair<?> p

    对于2.3.4让我们通过代码来详细了解一下吧。

    public class PairTest3
    {
       public static void main(String[] args)
       {
          Manager ceo = new Manager("Gus Greedy", 800000, 2003, 12, 15);
          Manager cfo = new Manager("Sid Sneaky", 600000, 2003, 12, 15);
          Pair<Manager> buddies = new Pair<>(ceo, cfo);      
          printBuddies(buddies);
    
          ceo.setBonus(1000000);
          cfo.setBonus(500000);
          Manager[] managers = { ceo, cfo };
    
          Pair<Employee> result = new Pair<>();
          minmaxBonus(managers, result);
          System.out.println("first: " + result.getFirst().getName() 
             + ", second: " + result.getSecond().getName());
          maxminBonus(managers, result);
          System.out.println("first: " + result.getFirst().getName() 
             + ", second: " + result.getSecond().getName());
          
          
          
       }
    
       public static void printBuddies(Pair<? extends Employee> p)
       {
          Employee first = p.getFirst();
          Employee second = p.getSecond();
          System.out.println(first.getName() + " and " + second.getName() + " are buddies.");
       }
    
       //超类型通配符
       public static void minmaxBonus(Manager[] a, Pair<? super Manager> result)
       {
          if (a == null || a.length == 0) return;
          Manager min = a[0];
          Manager max = a[0];
          for (int i = 1; i < a.length; i++)
          {
             if (min.getBonus() > a[i].getBonus()) min = a[i];
             if (max.getBonus() < a[i].getBonus()) max = a[i];
          }
          result.setFirst(min);
          result.setSecond(max);
       }
    
       public static void maxminBonus(Manager[] a, Pair<? super Manager> result)
       {
          minmaxBonus(a, result);
          PairAlg.swapHelper(result); // OK--swapHelper captures wildcard type
       }
    }
    
    class PairAlg
    {
        //无限定通配符
        //该方法用来测试一个pair是否包含一个 引用
       public static boolean hasNulls(Pair<?> p)
       {
          return p.getFirst() == null || p.getSecond() == null;
       }
       public static void swap(Pair<?> p) { swapHelper(p); }
    
       public static <T> void swapHelper(Pair<T> p)
       {
          T t = p.getFirst();
          p.setFirst(p.getSecond());
          p.setSecond(t);
       }
    }

    5.泛型反射

    public class GenericReflectionTest
    {
       public static void main(String[] args)
       {
          // read class name from command line args or user input
          String name;
          if (args.length > 0) name = args[0];
          else
          {
             Scanner in = new Scanner(System.in);
             System.out.println("Enter class name (e.g. java.util.Collections): ");
             name = in.next();
          }
    
          try
          {
             // print generic info for class and public methods
             Class<?> cl = Class.forName(name);
             printClass(cl);
             for (Method m : cl.getDeclaredMethods())
                printMethod(m);
          }
          catch (ClassNotFoundException e)
          {
             e.printStackTrace();
          }
       }
    
       public static void printClass(Class<?> cl)
       {
          System.out.print(cl);
          printTypes(cl.getTypeParameters(), "<", ", ", ">", true);
          Type sc = cl.getGenericSuperclass();
          if (sc != null)
          {
             System.out.print(" extends ");
             printType(sc, false);
          }
          printTypes(cl.getGenericInterfaces(), " implements ", ", ", "", false);
          System.out.println("----");
       }
    
       public static void printMethod(Method m)
       {
          String name = m.getName();
          System.out.print(Modifier.toString(m.getModifiers()));
          System.out.print(" ");
          printTypes(m.getTypeParameters(), "<", ", ", "> ", true);
          //System.out.println();
    
          printType(m.getGenericReturnType(), false);
          System.out.print(" ");
          System.out.print(name);
          System.out.print("(");
          printTypes(m.getGenericParameterTypes(), "", ", ", "", false);
          System.out.println(")");
       }
    
       public static void printTypes(Type[] types, String pre, String sep, String suf, 
             boolean isDefinition)
       {
          if (pre.equals(" extends ") && Arrays.equals(types, new Type[] { Object.class })) return;
          if (types.length > 0) System.out.print(pre);
          for (int i = 0; i < types.length; i++)
          {
             if (i > 0) System.out.print(sep);
             printType(types[i], isDefinition);
          }
          if (types.length > 0) System.out.print(suf);
       }
    
       public static void printType(Type type, boolean isDefinition)
       {
          if (type instanceof Class)
          {
             Class<?> t = (Class<?>) type;
             System.out.print(t.getName());
          }
          else if (type instanceof TypeVariable)
          {
             TypeVariable<?> t = (TypeVariable<?>) type;
             System.out.print(t.getName());
             if (isDefinition)
                printTypes(t.getBounds(), " extends ", " & ", "", false);
          }
          else if (type instanceof WildcardType)
          {
             WildcardType t = (WildcardType) type;
             System.out.print("?");
             printTypes(t.getUpperBounds(), " extends ", " & ", "", false);
             printTypes(t.getLowerBounds(), " super ", " & ", "", false);
          }
          else if (type instanceof ParameterizedType)
          {
             ParameterizedType t = (ParameterizedType) type;
             Type owner = t.getOwnerType();
             if (owner != null)
             {
                printType(owner, false);
                System.out.print(".");
             }
             printType(t.getRawType(), false);
             printTypes(t.getActualTypeArguments(), "<", ", ", ">", false);
          }
          else if (type instanceof GenericArrayType)
          {
             GenericArrayType t = (GenericArrayType) type;
             System.out.print("");
             printType(t.getGenericComponentType(), isDefinition);
             System.out.print("[]");
          }
       }
    }

     

     

  • 相关阅读:
    可视化工具搭建SVN服务器
    VS添加lib库以及代码中相对路径的问题
    编程:休息片刻的好处
    我的C++笔记
    【转】缩小mysql数据库的ibdata1文件
    MySQL导库命令
    Java中的serialize接口与transient关键字
    蓝桥杯 算法提高 01背包
    蓝桥杯 算法提高 01背包
    蓝桥杯 算法提高 快乐司机
  • 原文地址:https://www.cnblogs.com/yourarebest/p/5135828.html
Copyright © 2020-2023  润新知