为什么要使用泛型?怎么用泛型?

Posted chenglei0718

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要使用泛型?怎么用泛型?相关的知识,希望对你有一定的参考价值。

一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型,我们在获取这个类型的时候拿到的也是Object,虽然可以进行强制转换,但是可能会发生类型转换异常java.lang.ClassCastException运行时异常,比如:

public static void main(String[] args) 
//        method1();
        Map<String, Object> map = new HashMap<>();
        map.put("key1", "123");
        map.put("key2", 456);
        System.out.println((String) map.get("key1"));//123
        System.out.println((String) map.get("key2"));//java.lang.ClassCastException
    

这样在我们取map的值时,必须一一对应使用正确的类型来进行强转,很容易就会出错,但是如果用泛型就可以将异常提前在编译期就暴露出来,比如:

 public static void main(String[] args) 
//        method1();
//        method2();
        Map<String, String> map = new HashMap<>();
        map.put("key1", "123");
        map.put("key2", 456);//编译不通过
        System.out.println((String) map.get("key1"));
        System.out.println((String) map.get("key2"));
    

总结就是将运行时期的ClassCastException,转移到了编译时期变成了编译失败。 避免了类型强转的麻烦。

当然这只是最基本的用法,先来说下泛型一共有多少种用法,以及使用的格式

  • 定义和使用含有泛型的类 ,格式:修饰符 class 类名<代表泛型的变量>     public Class ArrayList<E>
  • 定义和使用含有泛型的方法,格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数)    public <E> void method(E e)
  • 定义和使用含有泛型的接口,格式:修饰符 interface接口名<代表泛型的变量>     public interface<E>

其中含有泛型的接口有两种情况:(泛型类好像也可以)

public MyTest  implements Test<String>

public MyTest<T> implements Test<T>

泛型通配符

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配 符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

泛型的上限:

  • 格式: 类型名称 <? extends 类 > 对象名称
  • 意义: 只能接收该类型及其子类

泛型的下限:

  • 格式: 类型名称 <? super 类 > 对象名称
  • 意义: 只能接收该类型及其父类

引用下大佬的文章:https://blog.csdn.net/s10461/article/details/53941091

 

以上是关于为什么要使用泛型?怎么用泛型?的主要内容,如果未能解决你的问题,请参考以下文章

java中啥是泛型,怎么用泛型?

为什么用泛型?

为啥 TypeScript 对象不能用泛型类型索引?

为什么要使用泛型和迭代器

iOS 强大的泛型,同样也可以对UIButton进行扩展

Java泛型详解