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

2022-09-02 10:35:34

我最近偶然发现了一段代码,如下所示:

Object o = .. ;
Foo foo = Foo.class.cast(o);

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

Object o = ..;
Foo foo = (Foo)o;

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


答案 1

我不认为它经常完全按照您的指示使用。我看到的最常见的用法是使用泛型的人试图做这个等价物:

public static <T extends Number> T castToNumber(Object o) {
    return (T)o;
}

由于类型擦除,这并没有真正做任何有用的事情。

鉴于这是有效的,并且是类型安全的(模):ClassCastExceptions

public static <T extends Number> T castToNumber(Object o, Class<T> clazz) {
    return clazz.cast(o);
}

编辑:谷歌番石榴的几个使用示例:


答案 2

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

public static void doSomething(Class<? extends SomeBaseClass> whatToCastAs,Object o)
    {
        SomeBaseClass castObj =  whatToCastAs.cast(o);
        castObj.doSomething();
    }

通常,使用更简单的铸造,除非它不够。


推荐