专栏首页BAT的乌托邦【小家java】泛型--那些年我们一起躺过的坑

【小家java】泛型--那些年我们一起躺过的坑

1、概述

java的泛型是在JDK5开始出现的,在各种设计模式中有非常广泛的应用,比如设计一些基类等,参数化类型(具体的类型参数化)对扩展性能提供很好的支持,避免了不安全的强转安全风险。当然,在java中泛型是“假”的,最终会被擦除,本文就针对于此做一些“坑”的mark

2、栗子说明

下面使用List没有加泛型,存在风险

public static void main(String[] args) {
     List list = new ArrayList();
     list.add("1");
     list.add(2);
     List<String> list2 = list; //不报错 因为类型一样
     list2.forEach(x -> System.out.println(x)); //报错 类型转换异常
}

下面对泛型的使用,一定要当心 小心传错值

public static void main(String[] args) {
     Integer[] ints1 = new Integer[]{1, 2, 3};
     int[] ints2 = new int[]{1, 2, 3};
     doSomething(ints1); //输出1,2,3
     doSomething(ints2); //输出[I@7cca494b 
 }

 private static void doSomething(T... values) {
     for (T value : values) {
         System.out.println(value);
     }
 }

我们发现第二个输出直接把int[]数组的地址打印,因为int[]被作为一个类型值给传递了

public static void main(String[] args) {
    List<String> stringArrayList = new ArrayList<>();
    List<Integer> integerArrayList = new ArrayList<>();
    Class<? extends List> aClass = stringArrayList.getClass();
    Class<? extends List> bClass = integerArrayList.getClass();
    System.out.println(aClass.isAssignableFrom(bClass)); //true
}

输出结果为true,有了上面的基础,这个结果此处就不做过多解释了 对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

  • 泛型的类型参数只能是类类型,不能是简单类型
  • 不能对确切的泛型类型使用instanceof操作

静态方法上引用泛型,需要注意

public static class A<T> {
  public static void get(Class<T> t){ //cannot be referenced from a static method
  }
}

编译报错:静态方法不能在上下文里引用泛型类型

public static class A<T> {
 public void get(Class<T> t){ 
 }
}

这样写就没有毛病了(非静态方法可以直接引用)

public static class A<T> {
   public static <E> void get(Class<E> t) {
   }
}

如果即使是静态方法,但是将泛型定义在方法上就没问题了。注意:必须放在static关键字后面

3、使用场景

综合上面所说,泛型的使用场景可以说是无处不在

4、最后

泛型其实非常好用,保持良好的编码习惯可以减少出错,在实际的编程过程中,自己可以使用泛型去简化开发,且能很好的保证代码质量。更多泛型的基本使用,可参考链接:java泛型使用详解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【小家Spring】Sping AOP中使用到的那些工具类盘点:AopUtils、AopConfigUtils、AspectJAopUtils 、AopProxyUtils、AopContext

    Spring AOP框架的代码结构组织得不可为不好,良好的面向对象的编程思想,其中很有一部分得益于它对代码的结构的把控。良好的封装、分层、隔离。而在其中起到重要...

    YourBatman
  • 【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)

    接着上一篇 【小家Spring】Spring Framework提供的实用纯Java工具类大合集(一)

    YourBatman
  • 【小家Spring】Spring贡献的多个注解相关的工具类:AnnotationUtils、AnnotatedElementUtils、AnnotationConfigUtils...

    本文主要聊聊Spring提供的多个关于注解相关的工具类:AnnotationUtils和AnnotatedElementUtils等等 因为很多逻辑都封装在了...

    YourBatman
  • 深入理解 Java 泛型

    泛型提供了一种将集合类型传达给编译器的方法,一旦编译器知道了集合元素的类型,编译器就可以对其类型进行检查,做类型约束。

    Coder小黑
  • Linux修改用户名和所属组

    腾讯云的云服务器的,初始的用户名和主机名都是分配的。主机名其实还好了,用户名总是一个ubuntu有点看的不爽,正好看到了用户管理,就在这准备改一下,mianhk...

    小二三不乌
  • (54) 剖析Collections - 设计模式 / 计算机程序的思维逻辑

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类。...

    swiftma
  • java多线程开发容易犯的错误

          昨天在社区上看到有人讨论多线程使用,多线程遇到一些问题以及一些使用技巧记录一下。为什么要使用多线程, 不能是为了用而用,和设计模式一样用的合理,会让...

    杉枫
  • (53) 剖析Collections - 算法 / 计算机程序的思维逻辑

    之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式...

    swiftma
  • [WCF-Discovery]服务如何能被”发现”

    要让作为服务消费者的客户端能够动态地发现可用的服务,首先的要求服务本身具有可被发现的特性。那么到底一个可被发现的服务和一个一般的服务有何不同呢?或者说如何让一个...

    蒋金楠
  • day39_Spring学习笔记_07_CRM_03

      /day36_06_Spring_crm/WebRoot/WEB-INF/pages/coursetype/listCourse.jsp

    黑泽君

扫码关注云+社区

领取腾讯云代金券