Java泛型类型擦除导致的类型转换问题

初步结论:泛型类型转换不靠谱;

源码:

package com.srie.testjava;

public class TestClassDefine4<T> {

    public static void main(String[] args) {
        TestClassDefine4<String> t4 = new TestClassDefine4<String>();
        String cast = t4.badCast(1);
        System.out.println(cast);
    }

    T badCast(Integer i) {
        return (T) i; // 此处有warning
    }
}

反编译:

package com.srie.testjava;

import java.io.PrintStream;

public class TestClassDefine4<T>
{
  public static void main(String[] args)
  {
    TestClassDefine4 t4 = new TestClassDefine4();
    String cast = (String)t4.badCast(Integer.valueOf(1));
    System.out.println(cast);
  }

  T badCast(Integer i) {
    return i;
  }
}

运行异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at com.srie.testjava.TestClassDefine4.main(TestClassDefine4.java:7)
时间: 2024-10-18 18:15:29

Java泛型类型擦除导致的类型转换问题的相关文章

揭开Java 泛型类型擦除神秘面纱

泛型,一个孤独的守门者. 大家可能会有疑问,我为什么叫做泛型是一个守门者.这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇.泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉. 文章开始的地方,先给大家奉上一道经典的测试题. List<String> l1 = new ArrayList<String>();List<Integer> l2 = new ArrayL

Java总结篇系列:类型转换/造型

Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用.首先,来了解下数据类型的基本理解:数据是用来描述数据的种类,包括其值和基于其值基础上的可进行的操作集合. Java中数据类型主要分为两大类:基本数据类型和引用数据类型.基本数据类型共有8种,分别是:布尔型boolean, 字符型char和数值型byte/short/int/long/float/double

java泛型擦除的神秘之处,边界处的动作,擦除的补偿

java泛型擦除的神秘之处 package org.rui.generics.erasure; public class HasF { public void f(){ System.out.println("hasf.f"); } } package org.rui.generics.erasure; /** * 边界 <T extneds Hasf>声明T必须具有类型HasF或者从Hasf导出的类型. * 如果情况确实如此,那么就可以安全地在obj上调用f()了 * T

使用Gson解析Json数组遇到的泛型类型擦除问题解决方法

谷歌Gson转换Json串有如下方法: public Object fromJson(String json, Type typeOfT); 可以使用它进行数组解析.如下,使用此方法解析Json串为类型MyBean的List数组,方法可用. List<MyBean> lst = new Gson().fromJson(data, new TypeToken<List<MyBean>>(){}.getType()); 但如果把MyBean改为泛型T,封装此方法为如下: L

java类型擦除(Java Type Erasure Mechanism)

在JDK5之后java提供了泛型(Java Genertics),允许在定义类的时候使用类型作为参数.泛型广泛应用于各类集合中.本文对其以及其用法进行介绍. 1.一个常见的错误 下面例子中,用List<Object>类型的参数来接收List<String>. public class Main { public static void main(String[] args) throws IOException { ArrayList<String> al = new

Java,泛型类型通配符和C#对比

指令系统 指令系统是计算机硬件的语言系统,与硬件的联系息息相关. 指令系统是指CPU所能够处理的全部指令的集合,是一个CPU的根本属性(指令系统决定了一个CPU能运行 什么样的程序).现在cpu仍然使用者X86指令集,不同类型的计算机包含的指令系统的种类和数目是不同的. 所有采用高级语言编出的程序,都需要编译或者解释成为机器语言后才能运行(编译原理),这些机器语 言中所包含的就是一条条的指令.一条指令就是机器语言的一个语句,它是一组有意义的二进制代码. 格式 零地址 在堆栈型计算机中,操作数一般

Java泛型擦除

Java泛型擦除: 什么是泛型擦除? 首先了解一下什么是泛型?我个人的理解:因为集合中能够存储随意类型的对象.可是集合中最先存储的对象类型一旦确定后,就不能在存储其它类型的对象了,否则,编译时不会报错.但执行时会抛出ClassCastException异常.为解决此问题,引入泛型,指定该集合对象中存储的对象类型,这样一旦该集合中存储了其它的对象类型,编译时会提示错误!(理解不当之处.希望大神多指点). 泛型的擦除就是说.在编译的时候集合中指定了确定的对象类型,但在执行时将集合中能够存储的该对象类

转:JAVA中各种字符编码类型转换

import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */public class ChangeCharset { /** 7位ASCII字符,也叫作ISO646-US.Unicode字符集的基本拉丁块 */ public static final String US_ASCII = "US-ASCII"; /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */ public static final

java学习笔记——数据类型及类型转换

数据类型分为: 1.引用类型(字符型); 2.基本数据类型(数值型); 以下为基本数据类型介绍(括号内的数字表示该类型所占据的字节数) a.整型 byte(8)   short(16)   int(32)   long(64) -128~127 -2^15~2^15-1 -2^31~2^31-1 -2^63~2^63-1 long l=1l; b.浮点类型 float(32)  double(64) 占位多的  精度高 占位少的 精度低 double d=8.9; float f=8.9f; f