首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我为什么要使用java.lang.Class.cast

我为什么要使用java.lang.Class.cast
EN

Stack Overflow用户
提问于 2011-10-26 16:38:20
回答 8查看 4.4K关注 0票数 20

我最近偶然发现了一段代码,它是这样的:

代码语言:javascript
运行
复制
Object o = .. ;
Foo foo = Foo.class.cast(o);

实际上,我甚至不知道java.lang.Class有一个强制转换方法,所以我查看了文档,从我收集到的信息来看,这只是对类对象所表示的类进行了强制转换。因此,上面的代码大致相当于

代码语言:javascript
运行
复制
Object o = ..;
Foo foo = (Foo)o;

所以我想知道,为什么我想要使用强制转换方法,而不是简单地使用“旧方法”进行强制转换。有没有一个很好的例子,说明使用强制转换方法比使用简单的强制转换方法更有好处?

EN

回答 8

Stack Overflow用户

发布于 2011-10-26 16:47:46

我认为它并不像你所展示的那样经常被使用。我见过的最常见的用法是,使用泛型的人们正在尝试做与此相当的事情:

代码语言:javascript
运行
复制
public static <T extends Number> T castToNumber(Object o) {
    return (T)o;
}

由于类型擦除,它实际上并没有做任何有用的事情。

虽然这是可行的,而且是类型安全的(模数为ClassCastExceptions):

代码语言:javascript
运行
复制
public static <T extends Number> T castToNumber(Object o, Class<T> clazz) {
    return clazz.cast(o);
}

编辑:来自google guava的几个使用示例:

  • MutableClassToInstanceMap
  • Cute在Throwables#propagateIfInstanceOf中的使用,用于类型安全的泛型抛出规范
票数 8
EN

Stack Overflow用户

发布于 2011-10-26 16:44:43

在Java中,给猫剥皮的方法通常不止一种。在您有框架代码的情况下,这样的功能可能很有用。想象一下这样一个方法,它接受一个Class对象实例和一个对象实例,并将对象case作为类返回:

代码语言:javascript
运行
复制
public static void doSomething(Class<? extends SomeBaseClass> whatToCastAs,Object o)
    {
        SomeBaseClass castObj =  whatToCastAs.cast(o);
        castObj.doSomething();
    }

通常,使用更简单的强制转换,除非它还不够。

票数 4
EN

Stack Overflow用户

发布于 2011-10-26 16:45:44

在某些情况下,您只知道在运行时将对象强制转换为哪种类型,这时必须使用强制转换方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7900410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档