背景 ECJ(Eclipse Compiler for Java)就是Eclipse自带的java编译器。 公司的项目都是在Eclipse上面做的。...调查发现是泛型方面的异常。整理如下。 1. 问题 公司源码肯定不能放,把问题整理之后,关键的几个类的UML类为: ?...Eclipse报警告 ? 但是正常编译,执行 但是javac是编译不通过的: ? image.png 那么制定了compiler为javac的Idea编译也就不通过了: ? image.png 2....后记 看起来javac比ECJ进行了更严格的泛型检查。但是问题不止于此,整理问题的过程中想到以下问题待思考,记下来以后学习: 项目部署用的Tomcat,依赖的也是官方jdk,为什么不会报错呢?...多数文章只会介绍泛型的使用,而泛型Class和基础性Class在Java规范里的区别究竟是什么呢?
如果咱们代码中使用已经过时的类或者方法时候,编译器会会给出警告提示。 ?...for example: void f(HashMap map) { map.put("key", "value"); } Hint: Pass -Xlint:unchecked to javac...“堆污染”,把一个带泛型的变量传给了一个不带泛型的变量。...关于泛型请看再谈泛型java---上和再谈Java泛型---下。从jdk1.7开始,Java编译器将会进行严格的检查,Java编译器会发出相应警告信息。...@FunctionalInterface主要是帮助程序避免一些低级错误, 例如:在上面的MyFunctionalInterfaceDemo的接口中再增加一个抽象方法。 ? 编译器就会报错了。
支持泛型的Java编译器(例如JDK5.0中的Javac)可以用来编译经过泛型扩充的Java程序(Java泛型程序),但是现有的没有使用泛型扩充的Java程序仍然可以用这些编译器来编译。...这样会产生一些编译器警告和潜在的运行时异常。当需要利用JDK 5之前开发的遗留代码,而不得不这么做时,也尽可能的隔离相关的代码。 在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。...Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。...因此,编译器禁止这样的行为。编译器会尽可能的检查可能存在的类型安全问题。对于确定是违反相关原则的地方,会给出编译错误。当编译器无法判断类型的使用是否正确的时候,会给出警告信息。...> list) { list.add(1);//编译错误 } 如上所示,试图对一个带通配符的泛型类进行操作的时候,总是会出现编译错误。其原因在于通配符所表示的类型是未知的。
你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。...根据你对这个泛型问题的回答情况,你会得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。...真这样做的话会导致编译错误。...4、如何阻止Java中的类型未检查的警告? ...如果你把泛型和原始类型混合起来使用,例如下列代码,java 5的javac编译器会产生类型未检查的警告,例如: List rawList = newArrayList() 注意: Hello.java
因为li是Integer对象的列表,而不是int值的列表,您可能会想知道为什么 Java 编译器没有发出编译时错误。编译器不会生成错误,因为它从i创建一个Integer对象并将该对象添加到li中。...使用泛型的代码比不使用泛型的代码有许多好处: 编译时进行更强的类型检查。 Java 编译器对泛型代码应用强类型检查,如果代码违反类型安全性,则会发出错误。...默认情况下,“未经检查”警告是禁用的,尽管编译器会给出提示。要查看所有“未经检查”警告,请使用-Xlint:unchecked重新编译。...在正常情况下,当所有代码同时编译时,编译器会发出未经检查的警告,以引起您对潜在的堆污染的注意。如果您分别编译代码的各个部分,很难检测到堆污染的潜在风险。...因此,如果您将任何类型的List对象分配给objectArray数组的任何数组组件,编译器不会发出警告或错误,如下所示: objectArray[0] = Arrays.asList(42); 这个语句将包含一个类型为
@SuppressWarnings 可以抑制一些可以通过编译但可能存在运行异常的代码发出警告,确定代码可以运行不会出现警告提示的情况下,可以使用该注解。...@SuppressWarning("unchecked"), (未选中) 告诉编译器忽略unchecked警告信息,如使用List,ArrayList等进行参数化泛型>产生的警告信息。...@SafeVarargs @SafeVarargs在JDK 1.7中引入,主要目的是处理可变长参数中的泛型,此注解告诉编译器:在可变长参数中的泛型是类型安全的。...可变长参数是使用数组存储的,而数组和泛型不能很好的混合使用。 注意:使用@SafeVarargs注解,对于非static或非final声明的方法,不适用,会编译不通过。...如果使用此注释类型注释类型,则编译器需要生成错误消息,除非: 类型是接口类型,而不是注释类型,枚举或类。注释类型满足功能界面的要求。
这是一道更好的泛型面试题。泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List来表示。...你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。...根据你对这个泛型问题的回答情况,你会得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。更多请参考这篇文章《揭开Java 泛型类型擦除神秘面纱》。...如何阻止Java中的类型未检查的警告?...如果你把泛型和原始类型混合起来使用,例如下列代码,Java 5的javac编译器会产生类型未检查的警告,例如 List rawList = new ArrayList(); 更多面试题及答案请在后台回复
你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。...根据你对这个泛型问题的回答情况,你会得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。请阅读我的Java中泛型是如何工作的来了解更多信息。 3....泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。另一方面表示了非限定通配符,因为可以用任意类型来替代。更多信息请参阅我的文章泛型中限定通配符和非限定通配符之间的区别。 ...如何阻止Java中的类型未检查的警告? ...如果你把泛型和原始类型混合起来使用,例如下列代码,Java 5的javac编译器会产生类型未检查的警告,例如 List rawList = new ArrayList(
java的编译期可能指的以下三种: 前端编译器:将.java文件变成.class文件,例如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ) JIT编译器(Just In Time Compiler...javac这类编译器对代码的运行效率几乎没有任何优化措施,但javac做了许多针对java语言代码过程的优化措施来改善程序员的编码风格和提高编码效率,java许多的语法特性都是靠编译器的语法糖来实现的。...5.1 javac编译器工作流程 Sun javac编译器的编译过程可以分为3个过程: 解析与填充符号表过程 插入式注解处理器的注解处理过程 分析与字节码生成过程 1....泛型与类型擦除 Java中的参数化类型只在源码中存在,在编译后的字节码中,已经被替换为原来的原生类型了,并且在相应的地方插入了强制转换代码。...所以说泛型技术实际上就是 Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。
@Override : 实现类要重写父类或者接口的方法 @SafeVarargs : 参数安全类型注解,告诉开发者不要用参数做一些不安全的操作 @SuppressWarnings : 阻止编译器发出告警...,比如调用了使用了 @Deprecated 标记的方法编译器会发出警告,可以使用 @SuppressWarnings 压制警告 可以通过 javac -X 命令查看可以压制的警告值: C:\Users\...BYRON.Y.Y>javac -X -Xlint 启用建议的警告 -Xlint:{all,auxiliaryclass,cast,classfile,deprecation...,比如可能使用了 @Deprecated divzero : 压制除数为0的警告 unchecked : 压制没有指定泛型的集合表达式 fallthrough : 压制 switch警告,比如某个case...,编译器会发出警告: @SuppressWarnings("finally") public String finallyTest(String str) { try
实际上编译器已经报出错误了,它告诉我们不能将字符串列表转换为对象列表 ? 为什么会报这个错呢?...这意味着在方法调用期间必须传递相同的实际类型参数,编译器自动通过调用来推断这个参数的类型是什么 泛型和类型推断 Java 编译器包含类型推断算法,用于在实例化泛型类、调用类的泛型构造函数或调用泛型方法时识别实际的类型参数...结果就是堆污染 第二个未检查的警告:由于泛型擦除,编译器也不能确定变量 s 是指 Set 还是 Set 类型,这时就会产生 unchecked warning...,因此会给出警告信息:存在可能的“堆污染”(heap pollution),即如果泛型的真实数据类型无法和参数数组的类型匹配,会导致ClassCastException异常。...有如下的警告信息: $ javac -Xlint:unchecked SafeVarargsTest.java SafeVarargsTest.java:18: 警告: [unchecked] 参数化
例如,如果 Lambda 表达式包装了一个 [[noreturn]] 的函数,编译器无法正确推断其行为,可能会导致警告或错误。...二、语法与使用(一)属性的放置位置根据 P2173R1 提案,属性可以放置在 Lambda 表达式的捕获列表之后,或者模板参数列表之后(如果 Lambda 表达式是泛型 Lambda)。...泛型 Lambda 表达式auto generic_lambda = [] [[nodiscard]] (T x) { return x + 1; };对于泛型 Lambda 表达式...例如,[[nodiscard]] 属性会影响 Lambda 表达式的调用者,如果调用者忽略了返回值,编译器会发出警告。...如果返回值被忽略,编译器会发出警告,提示开发者注意。(二)标记已弃用的 Lambda 表达式[[deprecated]] 属性可以用于标记已被弃用的 Lambda 表达式。
从Java 5.0起,您可以使用java.lang.SuppressWarning注释,来停用与编译单元子集相关的编译警告。 作用:用于抑制编译器产生警告信息。...Idea 设置泛型检查,变量、方法未使用检查 从 eclipse 转换到idea 发现有很多不习惯的地方,比如说 String s; List list = new ArrayList(); 没有未使用的变量...,未检查泛型,未使用的方法提示,特意查找了一下相关资料 设置泛型检查 我使用的是mac电脑,windows电脑应该类似 打开如图 ?...3.为单行泛型添加SuppressWarning 跳过泛型检查 在单个泛型代码上添加@SuppressWarning("rawtypes")可以跳过泛型检查,但是需要注意: 还需要在方法上添加 @SuppressWarning..."}) 跳过泛型检查 如图所示: ?
概述 JVM的编译器可以分为三个编译器: 1. 前端编译器:把.java转变为.class的过程。如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。 2....本节讲述的仅限于第一类编译过程 Javac编译器 Javac编译器本身是由Java语言编写的程序。 编译过程大致可以分为3个过程: 1. 解析与填充符号表过程。 2....Java语法糖 泛型和类型擦除 与C#的泛型不一样的是,Java的泛型只存在于程序源码中,在编译后的字节码文件中,就已经替换成原来的原生类型,也称为裸类型,并且在相应的地方插入了强制转型代码。...对于运行期的Java语言来说,ArrayList与ArrayList就是同一个类,所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除...,基于这种方法实现的泛型称为伪泛型。
BuiltinTypeAliasGenericBounds:用于检查类型别名的泛型参数边界,报告可能的错误和建议。...BuiltinTypeAliasGenericBoundsSuggestion:用于给出类型别名泛型参数边界的建议。...BuiltinTrivialBounds:用于检查泛型参数的边界是否是平凡的,报告可能的错误和建议。...BuiltinKeywordIdents:用于检查关键字命名的标识符,报告可能的错误和建议。 BuiltinExplicitOutlives:用于检查泛型参数的终极生命周期,报告可能的错误和建议。...BuiltinExplicitOutlivesSuggestion:用于给出泛型参数终极生命周期的建议。
该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。 Java5 为 Java 语言增加了几个新的特性,并且和它们一起增加了许多新的警告并承诺在将来增加更多的警告。...您可以为 "javac" 增加 -Xlint 参数来控制是否报告这些警告(如上面的 @Deprecated 部分所示)。...清单: - deprecation 使用了不赞成使用的类或方法时的警告 - unchecked 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型...虽然它听起来似乎会屏蔽潜在的错误,但实际上它将提高代码安全性,因为它将防止您对警告无动于衷 — 您看到的每一个警告都将值得注意。...合法字符串的集合随编译器而变化,但在 JDK 上,可以传递给 -Xlint 的是相同的关键字集合(非常方便)。并且要求编译器忽略任何它们不能识别的关键字,这在您使用一些不同的编译器时非常方便。
概述 了解javac的基本编译过程以及基本的处理细节 了解基本的前端优化手段:语法糖和泛型的实现 了解前后端编译的内容以及部分后端编译的内容。...这里挑几个重点的升级进行描述: 泛型 泛型的启发来源于pizza的后身scala语言的作者Martin Odersky,当他捣鼓出泛型这个东西 之后,立马被java官方邀请开发java的泛型,可怜的Martin...扯远了,泛型相信所有的java开发者都很熟悉了,这里不再进行单独介绍。通常情况下实现泛型有下面的两种办法: 泛化类型以前保持不变,平行加入泛化新类型 已有类型泛型化,不加入任何泛型类型。...,java的泛型只能算是一个“伪造”泛型。...泛型的擦除机制决定了java的泛型支持更多的是服务于编译器。 注意:1. 擦除只是code字节码擦除。2. 元数据保留擦除前的信息。
-g:{lines,vars,source} 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息 -deprecation 输出使用已过时的 API...这个参数在javac编译中是看不到什么作用的,因为调试信息都在class文件中,而我们看不懂这个class文件。 为了看出这个参数的作用,我们在eclipse中进行实验。...\bin] 如果利用 -bootclasspath 重新定义: javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包 java.lang...-source和-target •-source:使用指定版本的JDK编译,比如:-source 1.4表示用JDK1.4的标准编译,如果在源文件中使用了泛型,则用JDK1.4是不能编译通过的。...但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。
-g:{lines,vars,source} 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息 -deprecation 输出使用已过时的 API...这个参数在javac编译中是看不到什么作用的,因为调试信息都在class文件中,而我们看不懂这个class文件。 为了看出这个参数的作用,我们在eclipse中进行实验。...\bin] 如果利用 -bootclasspath 重新定义: javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包...-source和-target •-source:使用指定版本的JDK编译,比如:-source 1.4表示用JDK1.4的标准编译,如果在源文件中使用了泛型,则用JDK1.4是不能编译通过的。...但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。
像Eclipse等java IDE是怎么编译和查找java源代码的呢? 源代码保存 这个无需多说,在编译器写入代码,并保存到文件。这个利用流来实现。...-g 生成所有调试信息 -g:none 不生成任何调试信息 -g:{lines,vars,source} 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息...这个参数在javac编译中是看不到什么作用的,因为调试信息都在class文件中,而我们看不懂这个class文件。 为了看出这个参数的作用,我们在eclipse中进行实验。...\bin] 如果利用 -bootclasspath 重新定义:javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包 java.lang...-source和-target •-source:使用指定版本的JDK编译,比如:-source 1.4表示用JDK1.4的标准编译,如果在源文件中使用了泛型,则用JDK1.4是不能编译通过的。