在我的C ++时代里,学习过C风格的强制转换运算符的弊端后,我最初很高兴地发现Java 5中java.lang.Class
已经获得了一种cast
方法。
我以为最终我们有了一种面向对象的处理铸造的方法。
事实证明Class.cast
与static_cast
C ++不同。更像是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 ++的语言构造?
Class.cast()
。在这种情况下,除了您之外的所有人都只使用标准的强制转换运算符。(3)Java确实具有强制转换运算符作为语言构造。它与C ++不同。这是因为Java的许多语言结构与C ++不相似。尽管表面上有相似之处,但Java和C ++还是有很大不同。