Java中这两种投射方式有什么区别?

时间:2009-11-12 20:24:59

标签: java casting

在Java中这两种投射方式有什么区别?

  1. (CastingClass) objectToCast;

  2. CastingClass.class.cast(objectToCast);

  3. Class#cast(Object)的来源如下:

    public T cast(Object obj) {
    if (obj != null && !isInstance(obj))
        throw new ClassCastException();
    return (T) obj;
    }
    

    所以,cast基本上是转换操作的通用包装器,但我仍然不明白为什么你需要一个方法。

5 个答案:

答案 0 :(得分:7)

您只能将第一个表单用于静态链接的类。

在许多情况下这还不够 - 例如,您可能已经使用反射获取了类实例,或者它已作为参数传递给您的方法;因此第二种形式。

答案 1 :(得分:4)

因为你不能只写(T)objectToCast,而T是泛型类型参数(由于类型擦除)。 Java编译器可以让你这样做,但T将在那里被视为Object,因此即使您正在投射的对象实际上不是{{1}的实例,强制转换将始终成功}}。

答案 2 :(得分:2)

这首先是普通演员。它要求在编译时知道要转换的类型。它在编译时验证强制转换 是否正确,并检查(如果要转换为的类型不是通用的)强制转换 在运行时。

第二个使用反射api。它要求在运行时知道要转换的类。它在编译时不验证任何内容,但始终在运行时检查强制转换是否正确。

类型参数仅在编译类型中已知,因此您不能将第二种方法用于类型参数(表达式T.class不能编译)。

动态加载的类(例如使用Class.forName(String))仅在运行时已知,因此无法使用第一种方法。

编辑:但是,正如Pavel指出的那样,强制转换为动态加载的类是没有意义的。我同意Class.cast(Object)唯一真正有用的是强制转换为恰好有类对象可用的类型参数。

如果要转换的类型不包含类型参数,第一种方法更好,因为额外的编译时检查可以捕获错误,在运行时不会丢失类型安全性,并且可以获得更短的语法来启动。

答案 3 :(得分:1)

在第一个来硬编码演员类。

( ClassToCast ) objectToCast;

在第二个中,转换类可能一个参数:

Class toCast = getClassToCast();

toCast.cast( objectToCast );

答案 4 :(得分:0)

Here您可以找到使用Class#cast()的使用示例。它可能会给出新的见解。