• 第27条:优先考虑泛型方法


    如类可以从泛型中受益,方法也一样。静态工具方法尤其适合于泛型化。Collections中所有的方法是泛型化的。

    一个返回两个集合的联合的例子:

    publlic static Set union(Set s1, Set s2) {
        Set result = new HashSet(s1);
        result.addAll(s2);
        return result;
    }

    有两条警告,因为使用的是原生态类型Set。

    泛型化该方法:

    public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
        Set<E> result = new HashSet<E>(s1);
        result.addAll(s2);
        return result;
    }

    不再提示警告,因为它是类型安全的了。

    泛型单例工厂:有时候需要创建不可变但又适合于不同类型的对象。

    假设有一个接口,只有一个方法,接受和返回某个类型T的值

    public interface UnaryFunction<T> {
        T apply(T arg);
    }

    假设要提供一个恒等函数,如果在每次需要的时候都重新创建一个,会很浪费,如果泛型被具体化了,每个类型都需要一个恒等函数,但是它们被擦除之后,就只需要一个泛型单例

    private static UnaryFunction<Object> IDENTITY_FUNCTION =
                new UnaryFunction<Object>() {
                    @Override
                    public Object apply(Object arg) {
                        return arg;
                    }
                };
        
        @SuppressWarnings("unchecked")
        public static <T> UnaryFunction<T> indentityFunction() {
            return (UnaryFunction<T>) IDENTITY_FUNCTION;
    }

    递归类型限制:通过某个包含该类型参数本身的表达式来限制类型参数。

    public interface Comparable<T> {
        int compareTo(T o) {
    }

    类型限制<T extends Comparable<T>> 表示针对可以与自身进行比较的每个类型T

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

    该方法在列表中搜索,找出列表中的最大值。

  • 相关阅读:
    Vue基础简介
    Vue基础简介
    django生命周期请求l流程图
    CSRF与auth模块
    cookie与session django中间件
    Django forms组件与钩子函数
    ajax结合sweetalert实现删除按钮动态效果
    ajax数据交互
    如何绕过CDN找源站ip
    IP地址的另一种形式---一种隐藏IP的方法
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5724332.html
Copyright © 2020-2023  润新知