一、Python3.6新特性

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

 

1. 前语

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

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

以下写法是过错的:

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

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

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

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

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

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

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

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

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

5. 无法进行 instanceof 判别

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

public static void wrong(Listlist) { // error  if (list instanceof ArrayList) {
}
}

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

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

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

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

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

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

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

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

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

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

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

假如建立将呈现:

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

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

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

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

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

public class NoReload { public void sets(SetstrSet) { } public void sets(SetintSet) { }
}

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. Three.js 实现虎年春节3D创意页面

    背景 虎年 春节将至,本文使用 React + Three.js 技术栈,实现趣味 3D 创意页面.本文包含的知识点主要包括:ShadowMaterial. MeshPhongMaterial 两种基 ...

  2. elasticsearch之集成中文分词器

    IK是基于字典的一款轻量级的中文分词工具包,可以通过elasticsearch的插件机制集成: 一.集成步骤 1.在elasticsearch的安装目录下的plugin下新建ik目录: 2.在gith ...

  3. 免费增加几个T电脑空间方法,拿去不谢

    大家好,我是咔咔 不期速成,日拱一卒 在刷吾爱时猛然间看到一篇帖子名为,免费增加几个T电脑空间方法,拿去不谢,作为一名电脑磁盘深度缺乏者,这种文章怎能逃离我的法眼. 点进去大概瞅了一眼,大致意思就是把 ...

  4. JUC之线程池基础

    线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...

  5. c#操作符详解

    操作符概览 操作符(Operator)也译为"运算符" 操作符是用来操作数据的,被操作符操作的数据称为操作数(Operand) 操作符的本质 操作符的本质是函数(即算法)的&quo ...

  6. echart的x轴或y轴区间标签如何从大到小排列

    1.有时候我们做echart时,从后台接收返回回来的数据,没有按顺序排列,这里我遇到的是区间的值,看图 我这里是处理好了的,一开始,50-100这个区间在数组的最后一列,也就是在150-200后面的这 ...

  7. mysql加强(3)~分组(统计)查询

    一.分组(统计) 查询 1.语法 : select [distinct] *| 分组字段1[别名] [,分组字段2[别名],...] | 统计函数 from 表名 [别名] [where 条件(s)] ...

  8. Net6 DI源码分析Part2 Engine,ServiceProvider

    ServiceProvider ServiceProvider是对IServiceProvider实现,它有一个internal的访问修饰符描述的构造,并需要两个参数IServiceCollectio ...

  9. response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别

    感谢原文作者:krismile__qh 原文链接:https://blog.csdn.net/krismile__qh/article/details/89926001 一.response.getW ...

  10. 使用kubeadm快速部署一套K8S集群

    一.Kubernetes概述 1.1 Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. K8S用于容器化应用程序的 ...