java cast_Java Class.cast()与强制转换运算符

这篇博客讨论了Java中Class.cast()方法与C++的static_cast和reinterpret_cast的区别。作者通过测试用例展示了Class.cast()在运行时而非编译时检查类型转换,这可能导致意外的ClassCastException。文章提出疑问,是否应改进Class.cast()的行为,使其在编译时进行检查,或者引入类似C++的强制转换运算符。
摘要由CSDN通过智能技术生成

在我的C ++时代里,学习过有关C风格的强制转换运算符的弊端后,我很高兴首先发现Java 5中java.lang.Class已经获得了一种cast方法。

我以为最终我们有了一种面向对象的处理铸造的方法。

事实证明Class.cast与static_castC ++不同。更像是reinterpret_cast。它不会在预期的地方生成编译错误,而是会推迟到运行时。这是一个演示不同行为的简单测试用例。

package test;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class TestCast

{

static final class Foo

{

}

static class Bar

{

}

static final class BarSubclass

extends Bar

{

}

@Test

public void test ( )

{

final Foo foo = new Foo( );

final Bar bar = new Bar( );

final BarSubclass bar_subclass = new BarSubclass( );

{

final Bar bar_ref = bar;

}

{

// Compilation error

final Bar bar_ref = foo;

}

{

// Compilation error

final Bar bar_ref = (Bar) foo;

}

try

{

// !!! Compiles fine, runtime exception

Bar.class.cast( foo );

}

catch ( final ClassCastException ex )

{

assertTrue( true );

}

{

final Bar bar_ref = bar_subclass;

}

try

{

// Compiles fine, runtime exception, equivalent of C++ dynamic_cast

final BarSubclass bar_subclass_ref = (BarSubclass) bar;

}

catch ( final ClassCastException ex )

{

assertTrue( true );

}

}

}

所以,这些是我的问题。

应该Class.cast()放逐到泛型土地吗?那里有很多合法用途。

Class.cast()使用时,编译器是否应该生成编译错误,并且可以在编译时确定非法条件?

Java是否应提供强制转换运算符作为类似于C ++的语言构造?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值