zoukankan      html  css  js  c++  java
  • EffectiveJava(27)优先考虑使用泛型方法

    泛型方法也可以从泛型类中获得同等收益,泛型方法的转换也十分简单,只需将原生态类型改为泛型,基本就可以解决问题
    如:一个返回两个集合的联合

        public static Set union(Set s1,Set s2){
            Set result = new HashSet(s1);
            result.addAll(s2);
            return result;
        }
    它的编译虽然会通过,但是会有两条类型转换警告,要消除这些警告,将他们转换成泛型集合即可.
    ----->>>>>
    public static <E> Set<E> union(Set<E> s1,Set<E> s2){
        Set<E> result = new HashSet<E>(s1);
        result.addAll(s2);
        return result;
    }
    该方法可以返回相同的有限制的通配符类型的集合.因为他们在"相加"的时候,java会为我们做类型推导
    PS:类型推导 -- 便一起通过检查方法茶树的类型来计算类型参数的值
    但是在调用泛型构造器的时候,要明确传递类型参数的值可能有些麻烦 --->>>
    
        Map<String,List<String>> anagrams = new HashMap<String,List<String>>();
        我们可以编写一个泛型静态工厂方法消除这种冗余
        public static <K,V> HashMap<K,V> newHashMap(){
            return new HashMap<K,V>();
        }
    这个时候我们只需作如下声明:
    Map<String,List<String>> anagrams =newHashMap();
    

    注:语言所做的类型推导与调用泛型方法时所做的JDK1.6之前还不是相同的.
    与本节相关的使用方式是泛型单例工厂:创建不可变担忧适合于许多不同类型的对象 –
    运用泛型擦除特性,给所有必要的泛型参数使用单个对象,但是要编写一个静态工厂方法,重复地给每个必要的类型参数分发对象
    如:定义个返回接收泛型的接口

        public inteface UnaryFunction<T>{
            T apply(T arg);
        }
    通过泛型只需创建一个实例,不必为每种不同类型创建.
    
        private static UnaryFunction<Object> IDENTITY_FUNCTION = new naryFunction<Object>(){
            public Object apply(Object arg){
                return arg;
            }
        };
        //IDENTITY_FUNCTION 是无状态的并且它的类型参数是无限的,所以他可以安全的用在其他类型
        public static <T> UnaryFunction<T> identityFunction(){
            return (UnaryFunction<T>)IDENTITY_FUNCTION;
        }
    恒等函数:他返回未被修改的参数,因此无论T的值是什么,用他作为UnaryFunction<T>都是类型安全的
    

    泛型接口范例程序:

    String[] strings = {"a","b","c"};
        UnaryFunction<String> sameString = identityFunction();
        for(String s:Strings)
            System.out.println(sameString.apply(s));
        Number[] numbers = {1,2.0,3L};
        UnaryFunction<NUmber> sameNumber = identityFunction();
        for(Number n:numbers)
            System.out.println(sameNumber.apply(n));

    递归类型限制:通过某个包含该类型参数本身的表达式来限制类型参数
    示例:Comparable接口定义类型的自然顺序

        public interface Comparable<T>{
            int compareTo(T o);
        }
        public static <T extends Comparable<T>> T max(List<T> list){
            Iterator<T> it = list.iterator();
            T result = it.next();
            While(i.hasNext()){
                T t = it.next();
                if(t.compareTo(result)>0)
                    result = t;
            }
            return result;
        }

    总结:泛型方法就像泛型一样,使用起来比要求客户端转换属兔参数并返回值的方法类的更加安全,也更加容易.就像类型一样,你应该确保新方法可以不用转换就能使用,这通常意味着要将它们泛型化.并且就像类型一样,还应该将现有的方法泛型化,使新用户使用起来更加轻松,且不会破坏现有的客户端.

  • 相关阅读:
    文件上传Web小案例
    加密方法(MD5加密)
    解决中文乱码(不可能解决不了)
    jquery的一些常见使用方法
    Ajax的作用
    日期时间格式的转换
    前端点击复制内容
    uniapp 移动端防止点击事件穿透
    getCurrentPages 获取当前网页完整的URL
    关闭微信浏览器网页
  • 原文地址:https://www.cnblogs.com/qwop/p/6637280.html
Copyright © 2011-2022 走看看