我有一个通用的方法,我需要获取参数的类:

public static void doSomething(S inst) {

@SuppressWarnings("unchecked")

Class extends S> cls = (Class extends S>) inst.getClass();

// do something with 'cls' and with 'inst'...

}

事实证明,从编译器的类型系统的角度来看,.getClass()返回一个Class因此向下转换为Class这是一个未经检查的演员表. 我的问题如下:在什么情况下,这种下线是不安全的? IIUC,此方法的所有调用站点必须传递inst参数的值,该参数是静态(编译时)类型S.值的动态(运行时)类型D必须是S或子类型它们.因此,inst.getClass()将返回Class< D>给定D是S的子类型的对象应该可以赋给Class.

最佳答案

in what circumstance can this down-cast be unsafe?

inst.getClass()的返回类型是Class,其中| X |是表达式inst的编译时类型的擦除.这里,| X |是S的擦除,它是对象.这就是为什么它的Class而不是Class. 擦除是必要的原因是S可能是参数化类型,但只有在Class的类型参数中才应使用reified类型,因为Class对象仅表示具体类型.例如,你可以传入inst作为一个ArrayList< String>,但是获得一个Class>.

为什么有一个Class&lt ;?不安全? extends ArrayList< String>>?好吧,例如,您可以使用其.cast()方法将任何内容转换为ArrayList< String>没有任何警告.但是像.cast()这样的运行时类型检查只能检查已确定的类型(Class对象本身只表示一个具体的类型);他们无法检查类型参数(在运行时不存在).因此,使用.cast(),您实际上可以在没有警告的情况下进行未经检查的强制转换,这很糟糕.

java .class参数_java – 将.getClass()转换为类型参数相关推荐

  1. java 适用参数_Java功能的适用性

    java 适用参数 Java语言和标准库功能强大,但功能强大, 责任重大 . 一方面看到很多用户代码滥用或滥用稀有的Java功能,另一方面却完全忘记了大多数基本功能之后,我决定撰写此摘要. 这不是每个 ...

  2. java可选参数_Java可选

    java可选参数 In this article, we'll explore Java Optional class which was introduced in Java 8. 在本文中,我们将 ...

  3. java -jar 参数_java -jar 参数说明

    jvm 选项 Java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jv ...

  4. java 类 参数_java类类型参数

    上节说明了类类型变量和基本变量的赋值方式的不同,这次就谈谈类类型参数和基本类型参数之间的差别. 首先要明白什么是类类型参数.类类型参数,方法定义开始位置方法名称后面小括号中给定形式参数.类似于类类型变 ...

  5. java 有界类型_Java™ 教程(有界类型参数)

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

  6. java 不定参数_Java不定参数

    先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: Java代码   public class VariArgs { public static void main(String[]  ...

  7. java jersey 参数_Java Jersey:接收表单参数作为字节数组

    我试过如下: @Path("/someMethod") @POST @Produces(MediaType.TEXT_HTML) @Consumes(MediaType.APPLI ...

  8. java properties 参数_Java中Properties 类的详细使用

    我把你的头像,设置成我的名字,此刻你便与我同在. 我把你的名字,写进我的代码里面,以后,我的世界便存在着你. 一.Properties 类 Properties 类位于 java.util.Prope ...

  9. java 传入参数_java参数怎么传递参数

    计算机语言给子程序传递参数的方法有两种: 按值传递(call-by-value):这种方法将一个参数值复制成子程序的正式参数.这样,对子程序的参数的改变不影响调用它的参数. 引用调用(call-by- ...

最新文章

  1. java开发工具对比eclipse·myeclipse·idea
  2. Mybatis Interceptor 讲解
  3. ubuntu16 php mysql_Ubuntu16.04 搭建 LAMP(Ubuntu16.04 、apache 2.4.18、MySQL 5.7.22、PHP 7.0.28)...
  4. 虚拟机玩转缓存服务器,Nginx服务器中浏览器本地缓存和虚拟机的相关设置
  5. Linux文本处理之printf:规定输出内容与样式 %规定内容样式 \规定排版样式
  6. 在余额宝里放30万,每天在家什么都不干,利息够生活吗?
  7. JIRA官方:JIRA源代码集成
  8. 如何成为一名更出色的开发者?
  9. 可以十倍地提高.NET 应用程序的速度集群存储器对象缓存控件NCache
  10. WPS文字2013利用绘图工具中的形状裁剪出各式各样的图片
  11. FFMPEG安装及入门
  12. python中re.group()简介
  13. 物流管理过程中如何避免客户个人隐私信息泄露
  14. python ca模块_[转]常用的python模块及安装方法
  15. 可在线接收验证短信的网站
  16. js 清除对象里的属性值为空的属性
  17. npm 安装碰到SSL问题
  18. 二叉树(1.二叉树的概念堆)
  19. 空间3点求三点所在空间圆的圆心空间坐标
  20. EPICS Linux/Unbuntu 的安装说明(入门级)

热门文章

  1. 如何查看bmp文件头_效率神器:史上最强最小文件搜索软件Everything!
  2. 计算机网络:VLAN和VXLAN
  3. The LLVM Compiler Infrastructure | LLVM编译器基础设施
  4. GNU:GCC -O 优化等级
  5. LInux安装mbedtls
  6. OpenCV学习笔记:基础结构
  7. python3两个三阶矩阵相乘公式_Numpy 两个矩阵部分维度相乘,有没有很快的方法?...
  8. 聚类算法 距离矩阵_理解谱聚类
  9. java行转列_最近面试 Java 后端开发的感受!
  10. java设计模式之美_《设计模式之美》-笔记