泛型 Generic 类型擦除引起的问题及解决方法
1、先检查,再编译,以及检查编译的对象和引用传递的问题
public static void main(String[] args) {
ArrayList<String> arrayList=new ArrayList<String>();
arrayList.add("123");
arrayList.add(123);//编译错误
}
//以前的写法:
ArrayList arrayList = new ArrayList();
//现在的写法:
ArrayList<String> arrayList = new ArrayList<String>();
ArrayList<String> arrayList1 = new ArrayList(); //可以实现与完全【使用泛型参数】一样的效果
arrayList1.add("1");//编译通过
arrayList1.add(1);//编译错误
String str = arrayList1.get(0);//返回类型就是String
ArrayList arrayList2 = new ArrayList<String>();//可以实现与完全【不使用泛型参数】一样的效果
arrayList2.add(1);//编译通过
Object object = arrayList2.get(0);//返回类型就是Object
new ArrayList<String>().add("11");//编译通过
new ArrayList<String>().add(22);//编译错误
String string = new ArrayList<String>().get(0);//返回类型就是String
Type safety: The expression of type ArrayList needs unchecked conversion to conform to ArrayList<String> .
类型安全性:ArrayList类型的表达式需要未经检查的转换才能符合ArrayList <String>
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized .
ArrayList是一个原始类型。 对泛型类型ArrayList <E>的引用应该被参数化
ArrayList<String> arrayList=new ArrayList<Object>();//编译错误 Type mismatch: cannot convert from ArrayList<Object> to ArrayList<String>
ArrayList<Object> arrayList=new ArrayList<String>();//编译错误 Type mismatch: cannot convert from ArrayList<String> to ArrayList<Object>
ArrayList<Object> arrayList = new ArrayList<Object>();
ArrayList<String> arrayList2 = arrayList;//编译错误 Type mismatch: cannot convert from ArrayList<Object> to ArrayList<String>
ArrayList<String> arrayList = new ArrayList<String>();
ArrayList<Object> arrayList2 = arrayList;//编译错误 Type mismatch: cannot convert from ArrayList<String> to ArrayList<Object>
2、自动类型转换
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
3、类型擦除与多态的冲突和解决方法
class Pair<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
class DateInter extends Pair<Date> {
@Override
public void setValue(Date value) {
super.setValue(value);
}
@Override
public Date getValue() {
return super.getValue();
}
}
class Pair {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
DateInter dateInter = new DateInter();
dateInter.setValue(new Date());//编译正确
dateInter.setValue(new Object());//编译错误 The method setValue(Date) in the type DateInter is not applicable for the arguments (Object)
4、泛型类型变量不能是基本数据类型
5、运行时类型查询
ArrayList<String> arrayList = new ArrayList<String>();
System.out.println(arrayList instanceof ArrayList<?>);//true
System.out.println(arrayList instanceof ArrayList);//true
//System.out.println(arrayList instanceof ArrayList<Object>);//编译错误
//System.out.println(arrayList instanceof ArrayList<String>);//编译错误
Cannot perform instanceof check against parameterized type ArrayList<Object/String>.
无法对参数化类型ArrayList <Object/String>执行instanceof检查。
Use the form ArrayList<?> instead since further generic type information will be erased at runtime
使用形式ArrayList <?>,因为进一步的泛型类型信息将在运行时被擦除
6、异常中使用泛型的问题
public class Problem<T> extends Exception{...}
try{
}catch(Problem<Integer> e1){
}catch(Problem<Number> e2){
}
try{
}catch(Problem<Object> e1){
}catch(Problem<Object> e2){
}
public static <T extends Throwable> void doWork(Class<T> t){
try{
}catch(T e){ //编译错误
}
}
public static <T extends Throwable> void doWork(Class<T> t){
try{
}catch(T e){ //编译错误
}catch(IndexOutOfBounds e){
}
}
public static<T extends Throwable> void doWork(T t) throws T{
try{
}catch(Throwable realCause){
t.initCause(realCause);
throw t;
}
}
7、数组
Pair<String>[] table = new Pair<String>[10]; //Cannot create a generic array of Pair<String>
8、泛型类型的实例化
T t= new T(); //ERROR Cannot instantiate the type T
9、类型擦除后的冲突
public boolean equals(T value) {
//Name clash: The method equals(T) of type Pair<T> has the same erasure as equals(Object) of type Object but does not override it
//名称冲突:Pair <T>类型的方法equals(T)具有与Object类似的equals(Object)相同的擦除,但不覆盖它
return false;
}
class A implements Comparable<Integer> {
@Override
public int compareTo(Integer o) {
return 0;
}
}
class B extends A implements Comparable<String> {
//The interface Comparable cannot be implemented more than once with different arguments: Comparable<Integer> and Comparable<String>
//接口Comparable不能使用不同的参数多次实现:可比较的<Calendar>和Comparable <GregorianCalendar>
}
class A implements Comparable {//Comparable is a raw type. References to generic type Comparable<T> should be parameterized
@Override
public int compareTo(Object o) {
return 0;
}
}
class B extends A implements Comparable {
}
10、泛型在静态方法和静态类中的问题
public class Test<T> {
public static T one; //编译错误 Cannot make a static reference to the non-static type T
public static T show(T one){ //编译错误 Cannot make a static reference to the non-static type T
return null;
}
}
public class Test<T> {
public static <T >T show(T one){//这是正确的
return null;
}
}
泛型 Generic 类型擦除引起的问题及解决方法的更多相关文章
- Java泛型:类型擦除
类型擦除 代码片段一 Class c1 = new ArrayList<Integer>().getClass(); Class c2 = new ArrayList<String& ...
- 泛型的类型擦除后,fastjson反序列化时如何还原?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra~ 在前面的文章中,我们讲过Java中泛型的类型擦除,不过有小伙伴在后台留言提出了一个问题,带有泛型的实体的反序列化 ...
- Java泛型之类型擦除
类型擦除 学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组.无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦): ...
- ORACLE里怎么能判断一个日期类型的字段是否为空,解决方法:is null
ORACLE里怎么能判断一个日期类型的字段是否为空,解决方法:is null,解决方法:判断什么null都可以用is null.
- [改善Java代码]Java的泛型是类型擦除的
泛型可以减少强制类型的转换,可规范集合的元素类型,还可以提高代码的安全性和可读性,正是因为有了这些优点,自从Java引入泛型之后,项目的编码规则上便多了一条,优先使用泛型. Java泛型(Generi ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- 转:有关Java泛型的类型擦除(type erasing)
转载自:拈花微笑 自从Java 5引入泛型之后,Java与C++对于泛型不同的实现的优劣便一直是饭后的谈资.在我之前的很多training中,当讲到Java泛型时总是会和C++的实现比较,一般得出的结 ...
- java之集合类框架的简要知识点:泛型的类型擦除
这里想说一下在集合框架前需要理解的小知识点,也是个人的肤浅理解,不知道理解的正不正确,请大家多多指教.这里必须谈一下java的泛型,因为它们联系紧密,我们先看一下这几行代码: Class c1 = n ...
- java 泛型的类型擦除与桥方法
泛型类 --代码参考:java核心技术 卷1 第十版 public class Pair<T> { private T first; private T second; //构造器 pub ...
随机推荐
- spring boot thymeleaf常用方式
动态和静态区别 静态页面的return默认是跳转到/static/index.html,当在pom.xml中引入了thymeleaf组件,动态跳转会覆盖默认的静态跳转,默认就会跳转到/template ...
- NOIP2018游记(更新完毕)
10.13 初赛 Day -1 考前 这一次的考场从暗♂德华兴改到了长沙市一中,一进去:我一看,考场在哪???这一中比长郡大了好多,而且连指示牌都没有,这时碰见了谢总,谢总告诉我们在第二教学楼.路上还 ...
- Win10如何配置Jdk环境变量
对于每一位做Java开发的朋友来说,Jdk是必须要安装的,安装好了Jdk,其实并没有结束,还需要配置Jdk的环境变量,系统在不断地更新,小编给大家介绍一下如何在Win10下配置Jdk,并检测是否配置成 ...
- NetStandard类库实现Log4Net集成
前面都是Log4Net集成到NetCore项目中,集成到NetStandard类库还是第一次,所以记录一下 小提示:NetStandard要想同时被NetCore和NetFramework调用,需要在 ...
- python ftp操作脚本&常用函数
需求:快速进行ftp上传 ,下载,查询文件 原来直接在shell下操作: 需要[连接,输用户名,输密码,单文件操作,存在超时限制] 太过于繁琐,容易操作失败 脚本改进: 一句命令,搞定多文件上传,下载 ...
- Java并发(十七):ConcurrentHashMap
先做总结: 1.HashMap HashTable ConcurrentHashMap HashMap:线程不安全 HashTable:线程安全,每个方法都加了 synchronized 修饰.类似 ...
- wikioi 1017 乘积最大
dp[i][j]=max(dp[i][j],dp[t][k-1]*mapn[t+1][i]); dp[i][j]代表从0-i之间有j个乘号,mapn[i][j]表示第i位到第j位的数究竟是多少 #in ...
- C++反汇编-结构体和类
学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 对象的内存布局 一般计算公式: 对象内存大小 = sizeof(数据成员1)+ sizeof(数据成员2) +. ...
- Disable File System Redirector For Windows x64 (Python recipe)(转)
This disables the Windows File System Redirector.When a 32 bit program runs on a 64 bit operating sy ...
- Automatic WordPress Updates Using FTP/FTPS or SSH
Introduction When working with WordPress in a more secure environment where websites are not entirel ...