Java使用泛型的好处

泛型的作用

在Java中,泛型为Java对象在编译期增加一道类型检查,促使开发人员在使用泛型时能够安全地放置和使用数据。

泛型的定义

泛型可以定义在类、接口、方法中,编译器通过识别尖括号和尖括号内的字符来解析泛型。

其中约定俗成的字符包括:

E:Element,用于集合中的元素,如List<E>

K、V:Key和Value,如Map<K, V>

T:the Type of object

泛型的特点

1、尖括号里的每个元素都代表一种未知类型。

2、尖括号的位置必须在类名之后或方法返回值之前。

3、泛型在定义处只具备执行Object方法的能力。

4、泛型本质是一种语法糖,成功编译后会被类型擦除,可看成是一种编写代码的语法检查。

泛型的好处

1、类型安全。放置的是什么类型,取出来的就是什么类型,不用担心会抛出ClassCastException异常。

2、提升可读性。从编码阶段就显示的知道泛型集合、泛型方法等处理的对象类型是什么。

3、代码重用。泛型合并了同类型的处理代码,使代码重用度变高。

例子

下面的例子模拟了水果刀切水果的场景,首先是不使用泛型的实现方式:

public class FruitKnife {
    public static Object cut(Object fruit) {
        System.out.println("cut" + fruit);
        return fruit;
    }

    public static void main(String[] args) {
        // 切苹果
        Apple apple = new Apple();
        apple = (Apple) FruitKnife.cut(apple);
        // 切橙子
        Orange orange = new Orange();
        orange = (Orange) FruitKnife.cut(orange);
        // 切梨
        Pear pear = new Pear();
        pear = (Pear) FruitKnife.cut(pear);
    }
}
class Apple {}

class Orange {}

class Pear {}

cut方法为了能够适应所有类型的水果,定义成了Object类型,所以再拿到结果之后需要强制向下转型才能得到我们真正想要的结果,这显然存在类型转换异常的风险。

下面通过泛型方式实现:

public class FruitKnife {
    public static <T> T cut(T fruit) {
        System.out.println("cut" + fruit);
        return fruit;
    }

    public static void main(String[] args) {
        // 切苹果
        Apple apple = new Apple();
        apple = FruitKnife.cut(apple);
        // 切橙子
        Orange orange = new Orange();
        orange = FruitKnife.cut(orange);
        // 切梨
        Pear pear = new Pear();
        pear = FruitKnife.cut(pear);
    }
}
class Apple {
}

class Orange {
}

class Pear {
}

可以看到,通过使用泛型cut方法即兼容所有不同类型的水果,又避免了类型转换的风险。

下篇总结List、List<Object>、List<?>的区别,以及<? extends T>与<? super T>的使用场景。

以上内容根据《码出高效Java开发手册》学习整理

发布了149 篇原创文章 · 获赞 100 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u011212394/article/details/102558849