当前位置: 首页 > 知识库问答 >
问题:

转换为泛型基元类。方法无一例外地运行,如何运行和为什么运行?

章安易
2023-03-14

这里有一个方法,我在其中将一个对象转换为一个基元类型。

@SuppressWarnings("unchecked")
public <T> T fetchPrimitive(Object object, Class<T> clazz) {    
    return (T)object;
}

只要我的对象是与T相同的类(它是一个像int,double等的原始类),它就可以正常工作。

但是,当我提供错误的类进行强制转换时,此方法也会无一例外地运行。假设我将对象提供为boolean(true/false),将clazz提供为int.class,那么这个方法也运行并返回(true/false)实际对象。

我知道泛型不能在原语上工作。我只需要理解当我提供一个原语类作为参数并且返回类型是泛型时会发生什么。

例如:

Object object = true;
Class clazz = int.class;

Object result = fetchPrimitive(object,clazz); 
//result = true and result.getClass() is Boolean. 
//I asked it to convert a boolean to int expecting an exception but seems that it simply ignored the casting?

通过运行代码,我了解到当它是一个基元类时,它只是忽略了转换,并返回它是什么对象。我不希望它是这样的,如果提供了错误的类,我希望它抛出一个异常(ClassCastException)。

共有1个答案

雍马鲁
2023-03-14

由于JVM的工作方式,这对原语根本不起作用。由于返回类型是T,它会被擦除为object(如Flown的答案所示),即使返回一个原语,它也会被装箱回integer/boolean/等。

如果您希望方法能够返回一个基元,它必须在返回类型中指定,而且一个方法没有办法根据参数返回不同的基元。不幸的是,您必须为每个原语提供单独的方法,或者使用装箱。

 类似资料:
  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

  • 考虑这段代码: 这在Clang或GCC下不起作用,给我: 错误:不同指针类型“Foo*”和“Bar*”之间的条件表达式缺少强制转换Base*obj=!酒吧foo:bar; 这意味着要编译它,我必须将代码更改为: 既然存在到< code>Base*的隐式转换,那么是什么阻止了编译器这样做呢? 换句话说,为什么不使用强制转换,但使用操作员没有?是因为我不清楚我想使用部件吗?

  • 问题内容: 它是通过以下方式创建的: 一段时间后,我发现: 因此,我发现该事件根本没有运行。 问题答案: 您的事件调度程序正在运行吗?用检查。 如果您没有用户“ event_scheduler”的进程“ Daemon”,则该进程未运行。 因此,启动事件调度程序: 另请参见http://dev.mysql.com/doc/refman/5.1/zh-CN/events- configuration.

  • 问题内容: 我正在尝试确定elasticsearch实例是否正在运行,但它似乎不是: 和 和 UPD 我的elasticsearch.log: 问题答案: 当启动失败时,Elasticsearch服务初始化脚本不会在控制台或日志文件上显示任何错误信息,而是荒谬地显示。 您必须使用与初始化脚本相同的用户和参数来手动运行elaticsearch,以检查出了什么问题。错误消息将打印在控制台上。 在安装了

  • 我在phonegap 3.7上,我试图通过以下方式启动模拟器: 但是如果失败了: 错误:指定的目标设备无效。 [..] 错误:命令C:\Program Files(x86)\Microsoft SDK\Windows Phone\v8的错误代码为-2147024809。0\Tools\Xap部署\XapDeployCmd。带参数的exe:/installlau nch,C:/Users/kitsu

  • 我需要让 hbase 跑在 arm 上 而且想用 docker 所以我写了下面的 Dockerfile 我先跑在 x86 上,看看 ok 不 ok ,所以上面的 java home 是 amd64 的 但是不行 在我的虚拟机上,直接 JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 bash bin/hbase-daemon.sh start master 就