一、Python3.6新特性

什么情况下不能运用 Java 泛型

 

1. 前语

Java 1.5 引入了泛型来保证类型安全,避免在运行时发作类型转换反常,让类型参数化,提高了代码的可读性和重用率。可是有些情况下泛型也是不允许运用的,今日就总结一下编码中不能运用泛型的一些场景。

2. 根本类型无法直接运用泛型

以下写法是过错的:

  1. // error Map<int,char> wrong= new HashMap<>()

根本类型是不能够作为泛型类型的,需要运用它们对应的包装类。

  1. // OK Map<integer,character> wrong= new HashMap<>()

3. 泛型类型无法被直接实例化

泛型类型能够理解为一个笼统类型,只是代表了类型的笼统,因而咱们不能直接实例化它,下面的做法也是过错的:

  1. public E first(Listlist){ // error E e = new E(); return list.get(0);
  2. }

4. 泛型无法作为静态变量类型

Java 中的静态类型随着类加载而实例化,此刻泛型的详细类型并没有声明。一起因为静态变量作为所有对象的同享变量,只要类实例化或许办法调用时才能确认其类型。假如是泛型类型将无法确认其类型。相同在类上声明的泛型也无法作为返回值类型呈现在类的静态办法中,下面的写法也是过错的:

  1. public class Generic<T>{ // 不能将类声明的泛型类型作为静态变量 public static T t; // 也不能将类声明的泛型类型作为 静态办法的返回值 public static T rtval(Listlist){ return list.get(0);
  2. }
  3. }

5. 无法进行 instanceof 判别

Java 中的泛型是伪泛型,在编译期会被擦除,运行的字节码中不存在泛型,所以下面的判别条件无法进行:

  1. public static void wrong(Listlist) { // error if (list instanceof ArrayList) {
  2. }
  3. }

可是泛型的无界通配符  能够进行 instanceof 判别,你仔细想想为什么。

6. 无法创立参数化类型的数组

首要下面这种写法是对的:

  1. // OK List[] arrayOfLists = new List[2];

可是加上了泛型就编译不通过了:

  1. //error List[] arrayOfLists = new List[2];

假如不这么规定将引发以下逻辑过错:

  1. // 假如上面的建立,则下面的也应该建立 Object[] stringLists = new List[]; // 那么咱们能够放入 字符串 List stringLists[0] = new ArrayList(); // 放入 Integer list stringLists[1] = new ArrayList(); // 这显然不合理

7. 不能直接或许直接扩展Throwable

下面的两种写法将引发编译过错:

  1. // 不能直接地扩展 Throwable class IndirectException<T> extends Exception {} // 不能直接地扩展 Throwable class DirectException<T> extends Throwable {}

假如建立将呈现:

  1. try { // ... } catch (T e) { // 类型不确认 无法处理详细的反常逻辑 }

你怎么才能对反常进行详细的处理,这显然不便于精确的反常处理逻辑。可是你能够抛出一个 不确认的反常,可是相同不能在静态办法中运用类声明的泛型:

  1. class Parser<T extends Exception> { // 这样是对的 public void okThrow(File file) throws T { // ... } // 静态办法不能呈现类声明的泛型类型作为返回值和反常 public static void wrongThrow(File file) throws T {
  2. }
  3. }

8. 泛型擦除后相同参数签名的办法不能重载

由于泛型擦除的原因,以下的不视为办法的重载且无法编译 :

  1. public class NoReload { public void sets(SetstrSet) { } public void sets(SetintSet) { }
  2. }

9. 总结

今日总结了 Java 泛型的一些运用误区,虽然平常 IDE 的提示会告诉咱们,可是这也是咱们经常会疏忽的一些知识点。假如有不足之处,请留言纠正。假如你想对泛型了解更多,可关注公众号:码农小胖哥 回复 generic 获取相关的学习笔记。

<ul "="">

本文转载于:https://blog.csdn.net/dafengit/article/details/106073709

java的不正确使用方法以及什么情况不能使用java的更多相关文章

  1. [翻译][Java]ExecutorService的正确关闭方法

    https://blog.csdn.net/zaozi/article/details/38854561 https://blog.csdn.net/z69183787/article/details ...

  2. paip.批处理清理java项目冗余jar的方法

    paip.批处理清理java项目冗余jar的方法 在myeclipse中开发的java项目遇到jar包冗余情况,如何删除项目中的冗余jar包啊?项目很大jar包一百多个. 2010-09-14 14: ...

  3. Java获取各种常用时间方法大全

    Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...

  4. Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法

    Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...

  5. java.lang.reflect.Method.getAnnotation()方法示例

    转: java.lang.reflect.Method.getAnnotation()方法示例 作者: 初生不惑 Java技术QQ群:227270512 / Linux QQ群:479429477   ...

  6. 第29篇-调用Java主类的main()方法

    在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...

  7. JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...

  8. 从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更 ...

  9. 【转】线程池体系介绍及从阿里Java开发手册学习线程池的正确创建方法

    jdk1.7中java.util.concurrent.Executor线程池体系介绍 java.util.concurrent.Executor : 负责线程的使用与调度的根接口  |–Execut ...

随机推荐

  1. HDU-2032.杨辉三角(C语言描述)

    Problem Description 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 ...

  2. 【Java】回形数

    回形数 键盘读入一个整数n(1-20),以n为矩阵大小,把1,2,3,4,5-按顺时针螺旋的形式填入. import java.util.Scanner; public class HuiXingSh ...

  3. python2.7发送邮件失败之——邮箱安全问题

    使用python2.7发送邮件,通过脚本调试,脚本运行通过成功发出了邮件,但是目标邮箱qq没有收到. 刚开始怀疑脚本问题,上网查找资料后,发现邮箱发送成功后目标邮件没有收到有可能有以下几种原因: 1. ...

  4. 《剑指offer》面试题62. 圆圈中最后剩下的数字

    问题描述 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...

  5. prometheus基本概念(思维导图)

    参考文章: prometheus词汇表 prometheus的summary和histogram指标的简单理解

  6. 解决new Thread().Start导致高并发CPU 100%的问题

    背景 之前接手一个项目的时候,发现到处是 new Thread(()=>{ //do something }).Start(); 这么做的目的,无非是为了减少页面等待时间提高用户体验,把一些浪费 ...

  7. promise的队列,宏任务,微任务,同步任务

    // promise里面有一个特别的任务,就是微任务 // 同步任务>微任务>宏任务 setTimeout(() => { console.log("setTimeout& ...

  8. Android开发-页面布局

    首页布局 首页是ListView的布局 这个还需要制作ListView组件和适配器来显示数据. 关于页面 关于页面显示的是软件的基本信息和软件制作者的信息 这个就是采用基本的页面布局就行.

  9. 【Containerd版】Kubeadm高可用安装K8s集群1.23+

    目录 基本环境配置 节点规划 网段规划及软件版本 基本配置 内核升级配置 K8s组件及Runtime安装 Containerd安装 K8s组件安装 高可用实现 集群初始化 Master01初始化 添加 ...

  10. Java动态绑定和静态绑定-多态

    一.问题 Java方法调用过程中,Jvm是如何知道调用的是哪个类的方法?Jvm又是如何处理?   二.概念 a.当子类和父类(接口和实现类)存在同一个方法时,子类重写父类(接口)方法时,程序在运行时调 ...