泛型 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 ...
随机推荐
- 使用UniBeast安装Hackintosh(黑苹果)
前期准备 UniBeast 原版macOS Sierra安装包,由于苹果并没有提供完整dmg的下载地址,我也不在此提供,大家可以从信任的途径取得,文件后缀必须为dmg. 16GB或者更大的U盘 至少2 ...
- 网络数据修改工具netsed
网络数据修改工具netsed 通过修改网络数据,可以绕过软件和防火墙的限制,达到特定的目的.Kali Linux提供一个简易数据修改工具netsed.该工具支持对TCP和UDP的数据进行修改.渗透 ...
- ASP.net 简单分页的实现
在自己的项目中有一个文章的管理页面需要用到分页, 这种分页方法是在黑马的一个视频中看到的,便用在了自己的项目中. 但是使用控件实在是太丑,虽然我写的也丑....... gridview 控件提供的分页 ...
- 数据准备<5>:变量筛选-实战篇
在上一篇文章<数据准备<4>:变量筛选-理论篇>中,我们介绍了变量筛选的三种方法:基于经验的方法.基于统计的方法和基于机器学习的方法,本文将介绍后两种方法在Python(skl ...
- Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树
B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...
- 体感设备:因特尔 Intel RealSense R200,乐视LeTV Pro Xtion和Orb奥比中光bec Astra比较
最近调试三个个厂家的体感设备,第一个是Intel的RealSense R200(参数规格:分辨率:1080p,深度有效距离:0.51-4,USB3.0),第二个是乐视LeTV Pro Xtion(参数 ...
- php远程获取图片或文件信息(get_headers,fsocketopen,curl)
<?php if(!function_exists("remote_filesize")){ /** * 获取远程或本地文件信息 * @param string $strUr ...
- PowerDesigner导出图片
但是通过上面导出的图片会比较模糊不清晰,但是可以通过这样解决: 1.放大设计,然后全选复制全部 2.打开画图工具 3.粘贴到画图工具
- 通过Roslyn构建自己的C#脚本(更新版)
之前写过文章介绍过如何通过Roslyn构建自己的C#脚本,但那篇文章是参考自Roslyn CTP版的,记得本来想等到Roslyn正式版出来重新更新一下文档的,不过记得后来Roslyn是跳票了的,Scr ...
- oracle 锁系列
http://www.cnblogs.com/lhrbest/p/6091277.html