在编写处理表单数据的通用方法时,我遇到了以下(我认为)未完成的行为.给出以下代码:

public class Test {

public void someGenericMethod(Integer a) {

@SuppressWarnings("unchecked")

T t = (T) a;

System.out.println(t);

System.out.println(t.getClass());

}

public static void main(String[] args) {

Test test = new Test();

test.someGenericMethod(42);

}

}

AFAIK,上面的代码应该在行T t =(T)a中生成一个ClassCastException,因为main中的方法调用是将参数化类型设置为BigDecimal,并且不允许从Integer转换为BigDecimal,相反,我所期望的程序执行得很好并打印以下内容:

42

class java.lang.Integer

实际上,如果我在方法签名中添加另一个参数(如String b)并再生成另一个赋值T t2 =(T)b,则程序打印

42

class java.lang.String

为什么t变量将它的类型改为Integer(在任何可能的情况下,对T类型的对象进行某种促销)?

对此行为的任何解释都是受欢迎的

解决方法:

(T)a是未经检查的强制转换:由于type erasure,运行时无法知道T是什么类型,因此它无法实际检查是否属于类型T.

执行此操作时,编译器会发出警告;在您的情况下,您通过编写@SuppressWarnings(“未选中”)来抑制该警告.

编辑添加(以回应下面评论中的进一步问题):

如果你想检查演员表,你可以这样写:

public class Test {

public void someGenericMethod(Class clazz, Integer a) {

T t = clazz.cast(a);

System.out.println(t);

System.out.println(t.getClass());

}

public static void main(String[] args) {

Test test = new Test();

// gives a ClassCastException at runtime:

test.someGenericMethod(BigDecimal.class, 42);

}

}

通过传递clazz,允许运行时检查强制转换;而且,更重要的是,您允许编译器从方法参数中推断出T,因此您不必再编写测试.< BigDecimal> someGenericMethod.

当然,调用该方法的代码仍然可以通过使用未经检查的强制转换来避免这种情况:

public static void main(String[] args) {

Test test = new Test();

Class clazz = Object.class;

test.someGenericMethod((Class) clazz, 42);

}

但那是主要的错,而不是某些GenericMethod.

标签:java,generics

来源: https://codeday.me/bug/20190529/1181833.html

JAVA判定参数类型进行赋值_java – 为什么泛型方法在赋值中更改了参数化类型?...相关推荐

  1. Java可变参数类型实例

    可变参数:         Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 可变的参数类型,也称为不定参数类型.英文缩写是varargus ...

  2. java 限制参数类型_java定义受限制的类型参数操作

    有时您可能想限制可以在参数化类型中用作类型参数的类型. 例如,对数字进行操作的方法可能只希望接受Number或其子类的实例. 这就是有界类型参数的用途. 受限制参数类型的方法示例 要声明有界类型参数, ...

  3. java 参数类型不确定_java泛型的那些事

    学习泛型的理由 首先明确为什么需要学习泛型?个人觉得至少有三个理由:1.使用泛型可以让你在声明类(或者创建方法)的时候不着急立即去指定它的类型,而是等到你实例化对象(或者方法调用)的时候才明确它的类型 ...

  4. JAVA运算的类型兼容原则_Java基础语法回顾(一)

    Java基础语法 Java规范 image.png Java字节码 java程序是以".java"为扩展名,当我们编写完java程序后,要执行程序需要经过两个阶段:编译和运行. 编 ...

  5. 深度解析Java可变参数类型以及与数组的区别

    这篇文章主要介绍了Java方法的可变参数类型,通过实例对Java中的可变参数类型进行了较为深入的分析,需要的朋友可以参考下. Java方法中的可变参数类型是一个非常重要的概念,有着非常广泛的应用.本文 ...

  6. Java注解参数类型枚举值_EffectiveJava-5-枚举和注解

    用enum代替int常量 1. int枚举: 引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式. int枚举模式是类型不安全的,例如下面两组常量:性别和 ...

  7. java接口参数类型为枚举_Spring MVC处理参数中的枚举类型通用实现方法

    前言 在开发的过程中,会涉及到大量的枚举类型数据,我们都知道,Springmvc本身能自动转换很多的数据类型,也支持你自定义转换类型,非常灵活. 本文主要介绍的是关于Spring MVC处理参数的枚举 ...

  8. java 参数三点,java函数参数类型后添加三点的用法

    类型后面三个点(String...),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟...,表示此处接受的参数为0到多个Object类型的对象,或者 ...

  9. ParameterizedType获取java泛型参数类型

    这两天在看以前写的ssh项目时,遇到一个问题就是封装的BaseDaoImpl抽象类,构造方法里面是这样写的 Class<T> clazz;public BaseDaoImpl(){Para ...

最新文章

  1. 一机玩转docker之十:创建及使用ssh镜像
  2. hbase.client.keyvalue.maxsize的默认值
  3. Spire.XLS试用手记
  4. 【干货】PMcaff干货课程学习精彩分享:Apple Watch 技术特性详解
  5. C++的强制类型转换
  6. Spring中基于Java的配置@Configuration和@Bean用法
  7. 2021牛客多校2 - WeChat Walk(分块)
  8. java fileupload 文件_java用Commons fileupload 文件的上传
  9. 【java】6个延时队列的实现方案
  10. HTML5本地存储——IndexedDB二:索引
  11. Usage of #pragma
  12. 为什么油猴脚本会运行两次?
  13. leetcode LCP 03. 机器人大冒险
  14. 武汉男人一个月要赚多少钱,老婆才不用上班?心碎成渣……
  15. 2021-05-29当微商怎么引流?微商如何利用闲鱼引流?
  16. 一年后再回头看系列之C/C++中的选择法排序、冒泡排序
  17. 递归:昆虫繁殖C++实现
  18. Google Earth Engine APP(GEE)——利物浦大学免费下载影像的软件Google Earth Engine Digitisation Tool (GEEDiT)
  19. Java 2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示输入用户磅数,然后转换为千克并显示结果。一磅等于0.454千克。下面是一个运行示例:
  20. 解决 cannot connect to 192.168.1.136:5555: 由于目标计算机积极拒绝,无法连接。 (10061)

热门文章

  1. 那信息闭塞的地方 飞秋官方下载
  2. 2008-10-13 XEIM 2.0 beta 准时发布
  3. 刚开始学ASP+ACCESS时,该注意的事项
  4. C语言程序设计基础之联合
  5. 想加入IT行业为何建议你学Python,不要错过时机哦
  6. python解压打开文件过多_让Python在后台自动解压各种压缩文件!
  7. 开展“稳健”的生物信息学研究的9个要点
  8. 清华大学医学院 | 体外成熟人卵单细胞多组学研究及总结干细胞分化为配子进展文章...
  9. JAMA子刊:20来岁就要控制体重!分析超8万中国人数据发现,成年到中年体重每多增加10斤,老了之后死亡风险增加10%...
  10. Linux启动hbase的shell命令出现警告_系统启动优盘制作图文教程(Windows Linux 等)...