【Effective Java】7、优先考虑泛型方法

package cn.xf.cp.ch02.item27;

import java.util.HashSet;
import java.util.Set;

public class Union
{
    /**
     * 这个方法就会有警告
     * @param s1
     * @param s2
     * @return
     */
    public static Set union1(Set s1, Set s2)
    {
        Set result = new HashSet(s1);
        result.addAll(s2);
        return result;
    }

    /**
     * 这里使用泛型就是安全没有警告的
     * @param s1
     * @param s2
     * @return
     */
    public static <E> Set<E> union(Set<E> s1, Set<E> s2)
    {
        Set<E> result = new HashSet<E>(s1);
        result.addAll(s2);
        return result;
    }

}

但是有的时候,我们发现使用泛型的时候,在调用构造器的时候要明确泛型的类型,这样书写很麻烦

这里可以使用一个泛型静态方法,利用泛型的类型推导

package cn.xf.cp.ch02.item27;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GenericStaticFactory
{
    public static <K, V> HashMap<K, V> newHashMap()
    {
        return new HashMap<K, V>();
    }

    public static void main(String[] args)
    {
        //这里创建对象的时候,就会根据前面map中的String和List<String>自动转换
        Map<String, List<String>> anagrams = newHashMap();
    }
}

关于泛型单利工厂的实现

package cn.xf.cp.ch02.item27;

public class GenericSingletonFactory
{
    //先创建object对象,暂时替代T对象
    private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>()
    {
        public Object apply(Object arg)
        {
            return arg;
        }
    };

    //根据T,吧IDENTITY_FUNCTION转换为相应的类型,由于IDENTITY_FUNCTION返回未被修改的object类型参数,所以下面类型转换时安全的
    @SuppressWarnings("unchecked")
    public static <T> UnaryFunction<T> identityFunction()
    {
        return (UnaryFunction<T>) IDENTITY_FUNCTION;
    }

    public static void main(String[] args)
    {
        String[] strings =
        { "jute", "hemp", "nylon" };
        UnaryFunction<String> sameString = identityFunction();
        for (String s : strings)
            System.out.println(sameString.apply(s));

        Number[] numbers =
        { 1, 2.0, 3L };
        UnaryFunction<Number> sameNumber = identityFunction();
        //这里用来判断是否真的实现了单例
        Object t1 = sameString;
        Object t2 = sameNumber;

        if(t1 == t2)
        {
            System.out.println("相同引用");
        }

        String s1 = "123456";
        String s2 = new String("123456");

        if(s1.equals(s2))
            System.out.println("相同内容");

        for (Number n : numbers)
            System.out.println(sameNumber.apply(n));
    }
}

显示结果:

时间: 2024-12-18 22:03:47

【Effective Java】7、优先考虑泛型方法的相关文章

Effective Java 第三版——23. 优先使用类层次而不是标签类

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 23. 优先使用类层次而不是标签类 有时你可能会碰到一个类,它的实例有两个或更多的风格,并且包含一个标签属性(tag field),表示实例的风格. 例如,考虑这个类,它可

Effective Java 第三版——29. 优先考虑泛型

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 29. 优先考虑泛型 参数化声明并使用JDK提供的泛型类型和方法通常不会太困难. 但编写自己的泛型类型有点困难,但值得努力学习. 考虑条目 7中的简单堆栈实现: // Ob

Effective Java 第三版——46. 优先考虑流中无副作用的函数

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java

Effective Java 第三版——47. 优先使用Collection而不是Stream来作为方法的返回类型

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java

【电子书】Effective Java中文版下载

下载地址: 点击打开链接 (需要资源0分的联系我~) <Effective Java中文版(第2版)>主要内容:在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案.通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰.健壮和高效的代码.第2版反映了Java 5中最重要的变化,并删去了过时的内容. <Effective Java中文版(第2版)>中的每条规则都以简短.独立的小文章形式出现,并

Effective Java读后感

<Effective Java>读后感 1       创建和销毁对象 1.1    考虑用静态工厂方法代替构造器 静态工厂方法优点: 静态工厂方法与构造器(构造方法)不同的第一大优势在于,它们有名称.见名知意,突出区别. 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象. 静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象. 静态工厂方法与构造器不同的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁. 例如:

《Effective Java(中文第二版)》【PDF】下载

<Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)>[PDF]"  TITLE="<Effective Java(中文第二版)>[PDF]" /> 编辑推荐 <Sun 公司核心技术丛书:EffectiveJava中文版(第2版)>内容全面,结构清晰,讲解详细.可作为技术人员的参考用书.编码平添乐

Effective Java中的泛型部分

今天将Effective Java(第二版)中的泛型部分读完,深感自己泛型掌握有多么不熟练,还是需要多加练习. 废话少说,上点重点: 1.不要使用原型 比如: List list = new ArrayList(); 当你用该list引用指向其他带有泛型的List时,是不会出现编译错误的,只会给一个rawtype的警告,但是---- 这很容易出现挂羊头卖狗肉的情况,比如你指向了一个List<Integer>,却add了一个String,这不会出现任何编译错误,但 当你取出来转成Integer时

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

EFFECTIVE JAVA 第十章 并发

EFFECTIVE  JAVA  第十章  并发 66.同步访问共享的可变数据 *java语言规范保证读或写一个变量是原子的(可以保证返回的值是某个线程保存在该变量中的),除非这个变量的类型为long或double.(但并不保证一个线程写入的值对于另一个线程是可见) *synchronized修饰方法.synchronized代码块可以实现同步 *volatile修饰的变量只保证读取的是主存里最新的值而不是内存中该值的拷贝,使用volatile变量必须遵循(即变量真正独立于其他变量和自己以前的值