泛型 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 ...
随机推荐
- GOF设计模式快速学习
这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...
- Centos 安装 Wireshark
Wireshark是一款数据包识别软件,应用很广泛. yum install wireshark yum install wireshark-gnome
- OI刷题记录(Updating)
[Counter] [AGC]:0/96 [ARC]:0/70 [2016年省选]:0/69 [2017年省选]:22/75 [2018年省选]:0/63 [ZROI2018]:0/30 [ZROI2 ...
- Windows Server 2008 R2下将JBoss安装成windows系统服务
JBoss版本是jboss-4.2.3.GA-jdk6.zip,操作系统是Windows Server 2008 R2. 1.系统已安装好java环境,JAVA_HOME已配置好: 2.下载所需文件. ...
- HTML表单提交总结
概述:随着HTML5的兴起,前端越来越多样化,比如表单的提交,现在就有多种方式可以选择,下面总结一下常见的表单提交方式. 1.最基本的表单提交. <!DOCTYPE html> <h ...
- ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
B. Om Nom and Dark Park Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
- malloc、calloc和realloc比较
1.先看看它们的原型(stdlib.h): void *malloc( size_t size ); void *calloc( size_t numElements, size_t sizeOfEl ...
- 记ie8及以下版本ie的flash的addCallback的一坑
近来有一需求,播放声音,我在高端浏览器实现了html5 audio标签.低端浏览器实现了flash兼容.但是在调试ie8以下的浏览器发现js死活调不了flash里的addCallback的方法,总报错 ...
- git push时提示"Everything up-to-date"
从github上git clone下的项目,添加或修改文件后,git push时出现"Everything up-to-date" , 即“一切都是最新的'. 通过 git s ...
- POJ2155【二维树状数组,区间修改,点查询?】【又被输入输出坑】
这题反反复复,到现在才过. 这道题就是树状数组的逆用,用于修改区间内容,查询点的值. 如果单纯就这个奇偶数来判的话,似乎这个思路比较好理解. 看了一下国家集训队论文(囧),<关于0与1在信息学奥 ...